2016-02-10 52 views
1

在我的工作中我試圖做一些比較,因此我需要能夠從NDK寫入數據庫。 我試圖從this source鼓舞,但我不斷收到(從仿真器和物理設備)以下的插入錯誤:
文件進行加密或不是一個數據庫Android NDK寫入SQLite

我相關的代碼:

extern "C" 
{ 
    JNIEXPORT jstring JNICALL Java_package_Benchmark_getMessage(JNIEnv *env, jobject thisObj, jstring filePath, jstring databasePath) 
    { 
     sqlite3 *db; 
     const char *database = env->GetStringUTFChars(databasePath, 0); 
     if (sqlite3_open_v2(database, &db, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) // returns zero but probably sets db as read-only 
     { 
      if (SQLITE_OK != sqlite3_exec(db, "INSERT INTO lessons (wordCount, wordPassedCount, lessonName, selected) VALUES (0, 0, '50k', 0)", NULL, NULL, NULL)) 
       LOGD("%s", sqlite3_errmsg(db)); // here i get the error 
      int lesson_id = sqlite3_last_insert_rowid(db); 
      return env->NewStringUTF("Database opened!!"); 
     } 
     env->ReleaseStringUTFChars(databasePath, database); 
    } 
} 

所以我的問題是:
我(以及如何)可以插入到應用程序的數據庫,從NDK(在Java API創建的)?

作爲解決方法,我猜可能會創建臨時數據庫(未加密),但我寧願使用我之前創建的那個,它是由Java的SQLiteOpenHelper

+0

簡單地通過將文件提取到您的PC開始。如果你可以在那裏用sqlite打開它,你將能夠使用http://blog.kdehairy.com/using-sqlite-natively-on-android/。如果該文件被加密或損壞,則說明您有問題。 –

+0

我拉它,它是完全可讀和可寫的。 – Majkeee

回答

1

我發現了一個問題。 首先讓我說抱歉,因爲在我的問題中原始代碼中看不到問題。

我傳遞給C++函數路徑由

getDatabasePath("database_name").getAbsolutePath() 

返回數據庫文件,但它似乎返回符號鏈接和SQLite的路不知何故無法處理。

解決方案:

try { 
    getDatabasePath("database_name").getCanonicalPath(); 
} 
catch (IOException e) { e.printStackTrace(); } 

根據手冊規範確實解決符號鏈接。

+0

好抓!你可以接受你自己的答案。 –