2012-01-02 40 views
0

我有一个名为test.sqlite的数据库,并且我使用DDMS将数据库文件复制到data/data/packagename/databases文件夹中。 当我试图读取数据库时,我得到错误,因为表不存在 访问表的解决方案是什么?如何在android中使用现有数据库

下面是我访问数据库的代码。

SQLiteDatabase myDB = this.openOrCreateDatabase("test.sqlite", 
       SQLiteDatabase.OPEN_READWRITE, null); 
Cursor c = myDB.rawQuery("select a, b from abc", null); 
+0

你是从哪里复制的?确切的路径请。 – st0le 2012-01-02 11:58:45

+0

是位置data/data/your.package.name /数据库? – 2012-01-02 11:59:26

+0

是数据库路径是数据/数据/包/数据库 – Vamshi 2012-01-02 12:03:01

回答

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); 

这对我来说工作正常。

0

将您的sqlite数据库文件复制到data/data/<package_name>/databases目录中。

然后,一定要打开复制的SQLite数据库文件..

同时检查是否打开的是正确的数据库和表在这,看看这个查询,

SELECT * FROM sqlite_master where type='table' and name='my_table_name' 
+0

是的,我喜欢这个,但没有使用 – Vamshi 2012-01-02 12:11:33

+0

你从上面查询得到什么.. – user370305 2012-01-02 12:17:15

+0

没有这样的表abc .... – Vamshi 2012-01-02 12:18:18

2

为什么你想把数据库文件直接放入数据/数据文件夹中?为了测试目的?对我没有意义,我会选择以下选项之一:

  • 从服务器加载数据并将其插入到数据库中。
  • 将数据库文件放入资产文件夹,然后复制字节以创建应用程序数据库(您不能移动数据库文件)。

实例(如需要):

首先,你需要把你的数据库文件的资产/数据库文件夹内。如果你的数据库大于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();   
} 
+0

我有这么多的数据在服务器端,所以sqlite将花费这么多时间来加载数据,所以我正在使用现有的数据库 – Vamshi 2012-01-02 12:10:29

+0

好吧,所以这仅用于测试,对吧?在最终版本中,您将下载数据,或者您需要使用内置的数据部署应用程序? – 2012-01-02 12:12:54

+0

实际上没有在iPhone应用程序中建立的SQLite,所以我在Android中使用相同的SQLite,所以它会花费更少的时间。 – Vamshi 2012-01-02 12:15:55

相关问题