2016-02-10 3 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); 
    } 
} 

Так что мой вопрос:
Могу ли я (и как) вставить в базу данных приложения (созданный Java API) от NDK?

В качестве обходного решения я предполагаю, что можно создать временную базу данных (не зашифрованную), но я скорее использую тот, который я создал заранее, JavaiteOpenHelper Java.

+0

Начните с простого извлечения файла на компьютер. Если вы можете открыть его с помощью 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

Хороший улов! Вы можете принять свой собственный ответ. –