Sdílet prostřednictvím


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 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ž ListView k zobrazení vyžaduje nové zobrazení. Bude CursorAdapter se starat o recyklování zobrazení (na rozdíl od GetView 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í 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.