如何使用在内存中创建的数据库从Content Provider获取游标

时间:2016-11-08 17:03:01

标签: android-contentprovider

我在内存中创建了一个数据库,如下所示:

public class DbIoDatabaseHelper extends SQLiteOpenHelper {
//        public static final String DATABASE_NAME = "DbIo.db";
    public static final String DATABASE_NAME = ":memory:";
    private static final int DATABASE_VERSION = 1;
       public DbIoDatabaseHelper(Context context) {
//        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        super(context, null, null, DATABASE_VERSION);
        this.myContext = context.getApplicationContext();
    }
 .........
 }

在我的内容提供商中,查询如下:

 @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        final SQLiteDatabase db = myDb.getReadableDatabase();
        Cursor retCursor;
        switch (sUriMatcher.match(uri)) {
            case LABEL:
                retCursor = db.query(
                        IOContract.IoEntry.TABLE_NAME,
                        projection,
                        selection,
                        selectionArgs,
                        null,
                        null,
                        sortOrder
                );
                break;

            default:
                throw new UnsupportedOperationException("Unknown uri: " + uri);
        }

在我的活动中,光标是:

    Cursor c = contentResolver.query(cpUri, null, selection, argms, null);

当我使用DATABASE_NAME创建数据库时,数据库是在磁盘上创建的,我将光标恢复。

     public DbIoDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
//        super(context, null, null, DATABASE_VERSION);
        this.myContext = context.getApplicationContext();
    }

当我使用null在内存中创建它时,我在游标中没有元素 - 尽管返回的光标不是null。

  public DbIoDatabaseHelper(Context context) {
//        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        super(context, null, null, DATABASE_VERSION);
        this.myContext = context.getApplicationContext();
    }

有没有办法在内存中创建数据库时获得有效的游标,我该怎么办?      任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

谢谢XGouchet的回答。我通过以下方式解决了我的问题:我已经读过在内存中创建的数据库仅对创建它的活动可见。因此,我在OnCreate()方法的Content Provider中创建了数据库。

    @Override
    public boolean onCreate() {
         myDbData = new DatabaseData();
         myDb = new IODatabaseHelper(getContext());
         initializeDb();  // method that populates the database
         if (myDb == null) {
             ret = false;
         }
         return true;
    }