我有一个名为test.sqlite的数据库,我已使用DDMS将数据库文件复制到data/data/packagename/databases
文件夹中。
当我尝试读取数据库时,我收到错误,因为表不存在
访问该表的解决方案是什么。
以下是我访问数据库的代码。
SQLiteDatabase myDB = this.openOrCreateDatabase("test.sqlite",
SQLiteDatabase.OPEN_READWRITE, null);
Cursor c = myDB.rawQuery("select a, b from abc", null);
答案 0 :(得分:2)
为什么要将数据库文件直接放入数据/数据文件夹?出于测试目的?对我没有意义,我会选择以下选项之一:
示例(根据要求):
首先,您需要将数据库文件放在assets / database文件夹中。如果您的数据库大于1mb,则需要将其拆分。 (即database1,database2,database3 ......)
你可能有一个类来完成所有数据库任务,这里我有一个名为DatabaseHelper的类(扩展了SQLiteOpenHelper)。不要忘记设置数据库路径和名称。
private static String DB_PATH = "/data/data/com.example/databases/";
private static String DB_NAME = "mydb.sqlite";
如果必须拆分数据库,也要将碎片声明为变量。
private static String[] sFiles = {'database1','database2','database3'};
您可以使用getReadableDatabase()方法快速创建/打开数据库。
然后,创建一个这样的实现:
private void copyDatabase() throws IOException {
// Path to the empty database.
String outFilename = DB_PATH + DB_NAME;
// Open the empty database as the output stream.
OutputStream outputDatabase = new FileOutputStream(outFilename);
// Transfer bytes from the input file to the output file.
byte[] buffer = new byte[1024];
for (int i = 0; i < sFiles.length; ++i) {
// Open the local database as the input stream.
InputStream is = mContext.getAssets().open("database/" + sFiles[i]);
int length;
while ((length = is.read(buffer)) > 0) {
outputDatabase.write(buffer, 0, length);
}
// Closing stream.
is.close();
}
// Closing the streams.
outputDatabase.flush();
outputDatabase.close();
// Closing database.
close();
}
答案 1 :(得分:0)
将您的sqlite数据库文件复制到data/data/<package_name>/databases
目录。
然后确保您打开复制的sqlite数据库文件..
另外,要检查您是否正在打开正确的数据库以及此表中的哪个表,请查看此查询
SELECT * FROM sqlite_master where type='table' and name='my_table_name'
答案 2 :(得分:0)
感谢回复,最终它正在运作。我犯了一个错误,实际上我在data / data / packagename中复制了数据库文件,因此导致错误。
我所做的是再次将数据库复制到data / data / packagename / databases文件夹中。
SQLiteDatabase myDB = this.openOrCreateDatabase("test.sqlite",
SQLiteDatabase.OPEN_READWRITE, null);
Cursor c = myDB.rawQuery("select a, b from abc", null);
这对我来说很好。