Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Android poskytuje třídy adaptérů speciálně pro zobrazení dat z databázového dotazu SQLite:
SimpleCursorAdapter – podobá ArrayAdapter se tomu, protože se dá použít bez podtřídy. Jednoduše zadejte požadované parametry (například kurzor a informace o rozložení) v konstruktoru a pak je přiřaďte .ListView
CursorAdapter – základní třída, ze které můžete dědit, když potřebujete větší kontrolu nad vazbou hodnot dat k ovládacím prvkům rozložení (například skrytím nebo zobrazením ovládacích prvků nebo změnou jejich vlastností).
Adaptéry kurzoru poskytují vysoce výkonný způsob procházení dlouhých seznamů dat uložených v SQLite. Náročný kód musí definovat dotaz SQL v objektu Cursor a pak popsat, jak vytvořit a naplnit zobrazení pro každý řádek.
Vytvoření databáze SQLite
K předvedení adaptérů kurzoru je potřeba jednoduchá implementace databáze SQLite. Kód v SimpleCursorTableAdapter/VegetableDatabase.cs obsahuje kód a SQL k vytvoření tabulky a naplnění daty.
Kompletní VegetableDatabase třída je zde:
class VegetableDatabase : SQLiteOpenHelper {
public static readonly string create_table_sql =
"CREATE TABLE [vegetables] ([_id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, [name] TEXT NOT NULL UNIQUE)";
public static readonly string DatabaseName = "vegetables.db";
public static readonly int DatabaseVersion = 1;
public VegetableDatabase(Context context) : base(context, DatabaseName, null, DatabaseVersion) { }
public override void OnCreate(SQLiteDatabase db)
{
db.ExecSQL(create_table_sql);
// seed with data
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Vegetables')");
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Fruits')");
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Flower Buds')");
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Legumes')");
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Bulbs')");
db.ExecSQL("INSERT INTO vegetables (name) VALUES ('Tubers')");
}
public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{ // not required until second version :)
throw new NotImplementedException();
}
}
Třída VegetableDatabase bude vytvořena v OnCreate metodě HomeScreen aktivity. Základní SQLiteOpenHelper třída spravuje nastavení databázového souboru a zajišťuje, že SQL ve své OnCreate metodě běží pouze jednou. Tato třída se používá v následujících dvou příkladech pro SimpleCursorAdapter a CursorAdapter.
Aby dotaz kurzoru fungoval, musí mít celočíselnou CursorAdapter hodnotu_id. Pokud podkladová tabulka neobsahuje celočíselnou tabulku s názvem _id , použijte alias sloupce pro jiné jedinečné celé číslo v tom RawQuery , který tvoří kurzor. Další informace najdete v dokumentaci k Androidu.
Vytvoření kurzoru
Příklady používají RawQuery k převodu dotazu SQL na Cursor objekt. Seznam sloupců vrácený z kurzoru definuje datové sloupce, které jsou k dispozici pro zobrazení v adaptéru kurzoru. Zde je uveden kód, který vytvoří databázi v metodě SimpleCursorTableAdapter/HomeScreen.csOnCreate:
vdb = new VegetableDatabase(this);
cursor = vdb.ReadableDatabase.RawQuery("SELECT * FROM vegetables", null); // cursor query
StartManagingCursor(cursor);
// use either SimpleCursorAdapter or CursorAdapter subclass here!
Jakýkoli kód, který volá StartManagingCursor , by měl také volat StopManagingCursor. Příklady slouží OnCreate ke spuštění a OnDestroy zavření kurzoru. Metoda OnDestroy obsahuje tento kód:
StopManagingCursor(cursor);
cursor.Close();
Jakmile má aplikace k dispozici databázi SQLite a vytvořila objekt kurzoru, jak je znázorněno, může využít SimpleCursorAdapter buď podtřídu nebo podtřídu CusorAdapter k zobrazení řádků v objektu ListView.
Použití metody SimpleCursorAdapter
SimpleCursorAdapter je jako ArrayAdapter, ale specializované pro použití s SQLite. Nevyžaduje podtřídu – stačí nastavit některé jednoduché parametry při vytváření objektu a přiřadit ho k ListViewvlastnosti ' Adapter .
Parametry konstruktoru SimpleCursorAdapter jsou:
Kontext – odkaz na obsahující aktivitu.
Rozložení – ID prostředku zobrazení řádku, které se má použít.
ICursor – kurzor obsahující dotaz SQLite pro zobrazení dat.
Z pole řetězců – pole řetězců odpovídající názvům sloupců v kurzoru.
Celočíselné pole – pole ID rozložení, které odpovídají ovládacím prvkům v rozložení řádku. Hodnota sloupce zadaného v from poli bude svázána s ID ovládacího prvku zadaného v tomto poli ve stejném indexu.
to Pole from musí mít stejný počet položek, protože tvoří mapování ze zdroje dat na ovládací prvky rozložení v zobrazení.
Vzorový kód SimpleCursorAdapter SimpleCursorTableAdapter/HomeScreen.cs vytvoří následující:
// which columns map to which layout controls
string[] fromColumns = new string[] {"name"};
int[] toControlIDs = new int[] {Android.Resource.Id.Text1};
// use a SimpleCursorAdapter
listView.Adapter = new SimpleCursorAdapter (this, Android.Resource.Layout.SimpleListItem1, cursor,
fromColumns,
toControlIDs);
SimpleCursorAdapterje rychlý a jednoduchý způsob zobrazení dat SQLite v .ListView Hlavním omezením je, že může svázat pouze hodnoty sloupců k zobrazení ovládacích prvků, neumožňuje měnit jiné aspekty rozložení řádku (například zobrazení nebo skrytí ovládacích prvků nebo změny vlastností).
Podtřídy CursorAdapter
CursorAdapter Podtřída má stejné výhody výkonu jako SimpleCursorAdapter zobrazení dat z SQLite, ale také poskytuje úplnou kontrolu nad vytvářením a rozložením jednotlivých zobrazení řádků. Implementace CursorAdapter se velmi liší od podtřídyBaseAdapter, protože nepřepíše GetView, GetItemIdCount nebo this[] indexer.
Vzhledem k tomu, že pracujete s databází SQLite, stačí přepsat pouze dvě metody vytvoření CursorAdapter podtřídy:
BindView – Při zobrazení ho aktualizujte tak, aby zobrazovala data v zadaném kurzoru.
NewView – Volá se, když
ListViewk zobrazení vyžaduje nové zobrazení. BudeCursorAdapterse starat o recyklování zobrazení (na rozdíl odGetViewmetody u běžných adaptérů).
Podtřídy adaptéru v předchozích příkladech mají metody pro vrácení počtu řádků a načtení aktuální položky – CursorAdapter tyto metody nevyžadují, protože tyto informace lze zobrazit přímo z kurzoru. Rozdělením vytvoření a populace každého zobrazení do těchto dvou metod CursorAdapter vynucuje opětovné použití zobrazení. To je na rozdíl od běžného adaptéru, kde je možné ignorovat convertView parametr BaseAdapter.GetView metody.
Implementace kurzorovéhoadapteru
Kód v CursorTableAdapter/HomeScreenCursorAdapter.cs obsahuje podtřídu CursorAdapter . Uloží kontextový odkaz předaný do konstruktoru, aby mohl přistupovat k LayoutInflater metodě NewView . Úplná třída vypadá takto:
public class HomeScreenCursorAdapter : CursorAdapter {
Activity context;
public HomeScreenCursorAdapter(Activity context, ICursor c)
: base(context, c)
{
this.context = context;
}
public override void BindView(View view, Context context, ICursor cursor)
{
var textView = view.FindViewById<TextView>(Android.Resource.Id.Text1);
textView.Text = cursor.GetString(1); // 'name' is column 1 in the cursor query
}
public override View NewView(Context context, ICursor cursor, ViewGroup parent)
{
return this.context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, parent, false);
}
}
Přiřazení kurzorovéhoadapteru
V zobrazeném Activity zobrazení ListViewvytvořte kurzor a CursorAdapter pak ho přiřaďte k zobrazení seznamu.
Zde je uveden kód, který provede tuto akci v metodě CursorTableAdapter/HomeScreen.csOnCreate:
// create the cursor
vdb = new VegetableDatabase(this);
cursor = vdb.ReadableDatabase.RawQuery("SELECT * FROM vegetables", null);
StartManagingCursor(cursor);
// create the CursorAdapter
listView.Adapter = (IListAdapter)new HomeScreenCursorAdapter(this, cursor, false);
Metoda OnDestroy obsahuje StopManagingCursor volání metody popsané dříve.