2012-01-02 30 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

相關問題