Xamarin.Android에서 CursorAdapters 사용
Android는 SQLite 데이터베이스 쿼리의 데이터를 표시하기 위해 특별히 어댑터 클래스를 제공합니다.
SimpleCursorAdapter – 서브클래싱 없이 사용할 수 있기 때문에 유사 ArrayAdapter
합니다. 생성자에 필요한 매개 변수(예: 커서 및 레이아웃 정보)를 제공한 다음, 에 할당하기 ListView
만 하면 됩니다.
CursorAdapter – 레이아웃 컨트롤에 대한 데이터 값 바인딩을 보다 세부 제어해야 할 때 상속할 수 있는 기본 클래스입니다(예: 컨트롤 숨기기/표시 또는 속성 변경).
커서 어댑터는 SQLite에 저장된 긴 데이터 목록을 스크롤하는 고성능 방법을 제공합니다. 사용 코드는 개체에서 SQL 쿼리를 Cursor
정의한 다음 각 행에 대한 뷰를 만들고 채우는 방법을 설명해야 합니다.
SQLite 데이터베이스 만들기
커서 어댑터를 보여 주려면 간단한 SQLite 데이터베이스 구현이 필요합니다. SimpleCursorTableAdapter/VegetableDatabase.cs 코드에는 테이블을 만들고 일부 데이터로 채우는 코드와 SQL이 포함되어 있습니다.
전체 VegetableDatabase
클래스는 다음과 같습니다.
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();
}
}
클래스는 VegetableDatabase
활동의 메서드 HomeScreen
에서 OnCreate
인스턴스화됩니다. 기본 클래스는 SQLiteOpenHelper
데이터베이스 파일의 설정을 관리하고 해당 OnCreate
메서드의 SQL이 한 번만 실행되도록 합니다. 이 클래스는 다음 두 예제에서 사용됩니다.SimpleCursorAdapter
CursorAdapter
커서 쿼리에는 작동할 정수 열 _id
이 CursorAdapter
있어야 합니다. 기본 테이블에 명명 _id
된 정수 열이 없는 경우 커서를 구성하는 다른 고유 정수에 RawQuery
열 별칭을 사용합니다. 자세한 내용은 Android 문서를 참조하세요.
커서 만들기
예제에서는 SQL RawQuery
쿼리를 개체로 Cursor
변환하는 데 사용합니다. 커서에서 반환되는 열 목록은 커서 어댑터에 표시할 수 있는 데이터 열을 정의합니다. SimpleCursorTableAdapter/HomeScreen.cs OnCreate
메서드에서 데이터베이스를 만드는 코드는 다음과 같습니다.
vdb = new VegetableDatabase(this);
cursor = vdb.ReadableDatabase.RawQuery("SELECT * FROM vegetables", null); // cursor query
StartManagingCursor(cursor);
// use either SimpleCursorAdapter or CursorAdapter subclass here!
호출 StartManagingCursor
하는 모든 코드도 호출 StopManagingCursor
해야 합니다. 이 예제에서는 커서를 시작하고 OnDestroy
닫는 데 사용합니다OnCreate
. 메서드에는 OnDestroy
다음 코드가 포함됩니다.
StopManagingCursor(cursor);
cursor.Close();
애플리케이션에 SQLite 데이터베이스를 사용할 수 있고 표시된 대로 커서 개체를 만든 후에는 행을 표시하는 데 사용할 SimpleCursorAdapter
수 있는 ListView
서브클래스 또는 하위 클래스 CusorAdapter
를 활용할 수 있습니다.
SimpleCursorAdapter 사용
SimpleCursorAdapter
는 SQLite와 비슷하 ArrayAdapter
지만 특수화되어 있습니다. 서브클래싱이 필요하지 않습니다. 개체를 만들 때 몇 가지 간단한 매개 변수를 설정한 다음' Adapter
속성에 ListView
할당하기만 하면 됩니다.
SimpleCursorAdapter 생성자에 대한 매개 변수는 다음과 같습니다.
컨텍스트 – 포함하는 활동에 대한 참조입니다.
레이아웃 – 사용할 행 보기의 리소스 ID입니다.
ICursor – 표시할 데이터에 대한 SQLite 쿼리를 포함하는 커서입니다.
문자열 배열에서 – 커서에 있는 열의 이름에 해당하는 문자열 배열입니다.
정수 배열 - 행 레이아웃의 컨트롤에 해당하는 레이아웃 ID의 배열입니다. 배열에 from
지정된 열의 값은 동일한 인덱스에서 이 배열에 지정된 ControlID에 바인딩됩니다.
from
데이터 원본에서 보기의 레이아웃 컨트롤로의 매핑을 형성하기 때문에 배열과 to
배열의 항목 수는 같아야 합니다.
SimpleCursorTableAdapter/HomeScreen.cs 샘플 코드는 다음과 같이 연결됩니다SimpleCursorAdapter
.
// 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
는 SQLite 데이터를 ListView
에 표시하는 빠르고 간단한 방법입니다. 주요 제한 사항은 열 값만 바인딩하여 컨트롤을 표시할 수 있고 행 레이아웃의 다른 측면(예: 컨트롤 표시/숨기기 또는 속성 변경)을 변경할 수 없다는 것입니다.
CursorAdapter 서브클래싱
CursorAdapter
서브클래스는 SQLite의 데이터를 표시하는 것과 동일한 성능 이점을 SimpleCursorAdapter
제공하지만 각 행 보기의 생성 및 레이아웃을 완벽하게 제어할 수 있습니다. 구현은 재정의 CursorAdapter
또는 인덱서가 없기 GetView
this[]
Count
GetItemId
때문에 서브클래싱 BaseAdapter
과 매우 다릅니다.
작동하는 SQLite 데이터베이스가 있는 경우 서브클래스를 만들려면 두 가지 메서드만 재정의 CursorAdapter
하면 됩니다.
BindView – 뷰가 지정된 경우 제공된 커서에 데이터를 표시하도록 업데이트합니다.
NewView – 표시할 새 보기가 필요한 경우
ListView
호출됩니다. 일반CursorAdapter
어댑터의 방법과 달리GetView
재활용 보기를 처리합니다.
이전 예제의 어댑터 서브클래스에는 행 수를 반환하고 현재 항목을 CursorAdapter
검색하는 메서드가 있습니다. 커서 자체에서 정보를 수집할 수 있으므로 이러한 메서드가 필요하지 않습니다. 각 뷰의 생성 및 채우기를 이러한 두 가지 방법으로 CursorAdapter
분할하여 뷰를 다시 사용합니다. 이는 메서드의 매개 변수를 무시할 수 있는 일반 어댑터와 convertView
는 대조적입니다 BaseAdapter.GetView
.
CursorAdapter 구현
CursorTableAdapter/HomeScreenCursorAdapter.cs 코드에는 하위 클래스가 CursorAdapter
포함되어 있습니다. 메서드에서 액세스할 수 있도록 생성자에 전달된 컨텍스트 참조를 LayoutInflater
NewView
저장합니다. 전체 클래스는 다음과 같습니다.
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);
}
}
CursorAdapter 할당
커서를 Activity
ListView
표시할 위치에 커서를 CursorAdapter
만든 다음 목록 보기에 할당합니다.
CursorTableAdapter/HomeScreen.cs OnCreate
메서드에서 이 작업을 수행하는 코드는 다음과 같습니다.
// 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);
메서드는 OnDestroy
이전에 설명한 메서드 호출을 StopManagingCursor
포함합니다.