0

我在 assets 文件夹中有一个 sqlite db,对于我的应用程序的第一次启动,我将它复制到路径“data/data/databases”。

这在 Gingerbread 的所有设备上都可以正常工作,但是对于旧版本,当我查询 db 时,我得到一个 table not found 异常。事实上,数据库文件夹中的 db 是空的。它只包含一个 android_metadata 表。

这是我用来复制数据库的两种方法:

 public static void copyDBInMemoryIfNeeded(Context ctx, String pkgName) {
    try {
        String destPath = ctx.getFilesDir().getParentFile().getPath() + "/databases";
        File f = new File(destPath);
        if (!f.exists()) {
            f.mkdirs();
            f.createNewFile();
            copyDBInMemory(ctx.getAssets().open("mydb.sqlite"),
                    new FileOutputStream(destPath));
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void copyDBInMemory(InputStream inputStream, OutputStream outputStream)
        throws IOException {
    // ---copy 1K bytes at a time---
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }
    inputStream.close();
    outputStream.close();
}

这里是我的 DBAdapter 类:

public class DBAdapter {    

final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter(Context ctx) {
    this.context = ctx;
    DBHelper= new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
                + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }
}

public DBAdapter open() throws SQLException {
    db = DBHelper.getWritableDatabase();
    return this;
}

public void close() {
    DBHelper.close();
}                                                                                              }
4

2 回答 2

1

在 Android 2.2 及更低版本中,在 assets 文件夹中使用 sqlite 文件时应考虑一些事项。大于 1MB 的文件将无法复制到您的应用程序私有数据库文件夹中。不确定这是错误还是其他原因,但是如果您想使用数据库,可以在数据库助手中创建整个数据库模式。

解决方法:不确定这是否是一个好的选择,但它适用于我使用 12MB sqlite 数据库的情况,只需 remove.sqlite.db文件名中的任何类型的数据库扩展名,它就可以解决问题。

于 2013-06-24T15:36:45.470 回答
0

我结束了使用 HJSplit 拆分数据库,然后将部件放在 assets 文件夹中。然后我以这种方式复制“数据/数据/数据库”中的数据库:

    private static void copyDataBase(Context ctx, FileOutputStream os) throws IOException {
    AssetManager am = ctx.getAssets();
    byte[] b = new byte[1024];
    int r;
    for (int i = 1; i <= 5; i++) {
        InputStream is = am.open("mydb.sqlite.00" + i);
        while ((r = is.read(b)) != -1) {
            os.write(b, 0, r);
        }
        is.close();
    }
    os.close();
}
于 2013-06-24T19:24:09.930 回答