游标适配器和sqlite示例

Gai*_*ter 59 database sqlite android android-layout android-cursoradapter

您好我正在寻找与sqlite一起使用游标适配器的示例代码?

Jos*_*ter 103

真的很简单的例子.

这是一个非常简单但非常有效的例子.一旦你掌握了基础知识,你就可以轻松地建立它.

使用带有SQLite 的Cursor Adapter有两个主要部分:

  1. 从数据库中创建一个正确的Cursor.

  2. 创建一个自定义Cursor Adapter,它从数据库中获取Cursor数据,并将其与您打算用来表示数据的View配对.

1.从数据库中创建适当的光标.

在您的活动中:

SQLiteOpenHelper sqLiteOpenHelper = new SQLiteOpenHelper( 
        context, DATABASE_NAME, null, DATABASE_VERSION);

SQLiteDatabase sqLiteDatabase = sqLiteOpenHelper.getReadableDatabase();

String query = "SELECT * FROM clients ORDER BY company_name ASC"; // No trailing ';'

Cursor cursor = sqLiteDatabase.rawQuery(query, null); 

ClientCursorAdapter adapter = new ClientCursorAdapter(
        this, R.layout.clients_listview_row, cursor, 0 );

this.setListAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

2.创建自定义光标适配器.

注意:扩展自ResourceCursorAdapter假设您使用XML来创建视图.

public class ClientCursorAdapter extends ResourceCursorAdapter {

    public ClientCursorAdapter(Context context, int layout, Cursor cursor, int flags) {
        super(context, layout, cursor, flags);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView name = (TextView) view.findViewById(R.id.name);
        name.setText(cursor.getString(cursor.getColumnIndex("name")));

        TextView phone = (TextView) view.findViewById(R.id.phone);
        phone.setText(cursor.getString(cursor.getColumnIndex("phone")));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这值得更多.它非常清楚,有助于理解. (6认同)
  • "重复"与否,这个答案是谷歌搜索"cursoradapter示例"的最佳答案,是我见过的最清晰的. (6认同)
  • 谢谢@Chris.如果它对你有帮助,那就值得付出努力.:) (3认同)

Eri*_*ski 38

在Android中,如何在sqlite中使用带有原始查询的Cursor:

Cursor c = sampleDB.rawQuery("SELECT FirstName, Age FROM mytable " +
           "where Age > 10 LIMIT 5", null);

if (c != null ) {
    if  (c.moveToFirst()) {
        do {
            String firstName = c.getString(c.getColumnIndex("FirstName"));
            int age = c.getInt(c.getColumnIndex("Age"));
            results.add("" + firstName + ",Age: " + age);
        }while (c.moveToNext());
    }
}
c.close();
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子.让我建议一些改进来缩短它:1.删除`if(c!= null)`.原因:[`rawQuery`不会返回null](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery),如果确实如此,Sqlite中有一些错误实现和程序应该崩溃并发送错误报告,而不是默默地做任何事情.... (15认同)
  • ... 2.删除`if(c.moveToFirst())`并用`while(c.moveToNext()){...}`循环替换do-while.原因:[`rawQuery`总是返回位于第一行之前的Cursor](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery),所以第一个`moveToNext`会做究竟是什么moveToFirst会做的.... (7认同)
  • ... 3.在调用`rawQuery`之后放置`try {`,最后将`}放在`c.close()`周围.这样,如果在游标执行期间发生异常,游标将被正确关闭. (6认同)

Asw*_*ran 20

使用Sqlite的CursorAdapter示例

...
DatabaseHelper helper = new DatabaseHelper(this);
aListView = (ListView) findViewById(R.id.aListView);
Cursor c = helper.getAllContacts();
CustomAdapter adapter = new CustomAdapter(this, c);
aListView.setAdapter(adapter);
...

class CustomAdapter extends CursorAdapter {
    // CursorAdapter will handle all the moveToFirst(), getCount() logic for you :)

    public CustomAdapter(Context context, Cursor c) {
        super(context, c);
    }

    public void bindView(View view, Context context, Cursor cursor) {
        String id = cursor.getString(0);
        String name = cursor.getString(1);
        // Get all the values
        // Use it however you need to
        TextView textView = (TextView) view;
        textView.setText(name);
    }

    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // Inflate your view here.
        TextView view = new TextView(context);
        return view;
    }
}

private final class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "db_name";
    private static final int DATABASE_VERSION = 1;
    private static final String CREATE_TABLE_TIMELINE = "CREATE TABLE IF NOT EXISTS table_name (_id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_TIMELINE);
        db.execSQL("INSERT INTO ddd (name) VALUES ('One')");
        db.execSQL("INSERT INTO ddd (name) VALUES ('Two')");
        db.execSQL("INSERT INTO ddd (name) VALUES ('Three')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    public Cursor getAllContacts() {
        String selectQuery = "SELECT  * FROM table_name;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        return cursor;
    }
}
Run Code Online (Sandbox Code Playgroud)