如何在android中使用现有的数据库

时间:2012-01-02 11:57:14

标签: android database

我有一个名为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); 

3 个答案:

答案 0 :(得分:2)

为什么要将数据库文件直接放入数据/数据文件夹?出于测试目的?对我没有意义,我会选择以下选项之一:

  • 从服务器加载数据并将其插入数据库。
  • 将数据库文件放在assets文件夹中,然后复制字节以创建应用程序数据库(无法移动数据库文件)。

示例(根据要求):

首先,您需要将数据库文件放在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); 

这对我来说很好。