Použití kurzorovýchadapterů s Xamarin.Androidem
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 ListView
vlastnosti ' 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);
SimpleCursorAdapter
je 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
, GetItemId
Count
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ž
ListView
k zobrazení vyžaduje nové zobrazení. BudeCursorAdapter
se starat o recyklování zobrazení (na rozdíl odGetView
metody 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í ListView
vytvoř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.