다음을 통해 공유


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이 한 번만 실행되도록 합니다. 이 클래스는 다음 두 예제에서 사용됩니다.SimpleCursorAdapterCursorAdapter

커서 쿼리에는 작동할 정수 열 _idCursorAdapter 있어야 합니다. 기본 테이블에 명명 _id 된 정수 열이 없는 경우 커서를 구성하는 다른 고유 정수에 RawQuery 열 별칭을 사용합니다. 자세한 내용은 Android 문서를 참조하세요.

커서 만들기

예제에서는 SQL RawQuery 쿼리를 개체로 Cursor 변환하는 데 사용합니다. 커서에서 반환되는 열 목록은 커서 어댑터에 표시할 수 있는 데이터 열을 정의합니다. 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!

호출 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 또는 인덱서가 없기 GetViewthis[]CountGetItemId때문에 서브클래싱 BaseAdapter 과 매우 다릅니다.

작동하는 SQLite 데이터베이스가 있는 경우 서브클래스를 만들려면 두 가지 메서드만 재정의 CursorAdapter 하면 됩니다.

  • BindView – 뷰가 지정된 경우 제공된 커서에 데이터를 표시하도록 업데이트합니다.

  • NewView – 표시할 새 보기가 필요한 경우 ListView 호출됩니다. 일반 CursorAdapter 어댑터의 방법과 달리 GetView 재활용 보기를 처리합니다.

이전 예제의 어댑터 서브클래스에는 행 수를 반환하고 현재 항목을 CursorAdapter 검색하는 메서드가 있습니다. 커서 자체에서 정보를 수집할 수 있으므로 이러한 메서드가 필요하지 않습니다. 각 뷰의 생성 및 채우기를 이러한 두 가지 방법으로 CursorAdapter 분할하여 뷰를 다시 사용합니다. 이는 메서드의 매개 변수를 무시할 수 있는 일반 어댑터와 convertView 는 대조적입니다 BaseAdapter.GetView .

CursorAdapter 구현

CursorTableAdapter/HomeScreenCursorAdapter.cs 코드에는 하위 클래스가 CursorAdapter 포함되어 있습니다. 메서드에서 액세스할 수 있도록 생성자에 전달된 컨텍스트 참조를 LayoutInflaterNewView 저장합니다. 전체 클래스는 다음과 같습니다.

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 할당

커서를 ActivityListView표시할 위치에 커서를 CursorAdapter 만든 다음 목록 보기에 할당합니다.

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);

메서드는 OnDestroy 이전에 설명한 메서드 호출을 StopManagingCursor 포함합니다.