Нужно загрузить бд под андроид. Во время загрузки выдает вот эту ошибку SqliteException: database disk image is malformed
Получаю путь к бд:
pathDB = System.IO.Path.Combine(Application.persistentDataPath, dbName);
Копирую её если нужно
if (!System.IO.File.Exists (pathDB) || (isRewrite && !isUseSourceDB)) {
Debug.Log("Rewrite " + dbName);
if (sourcePath.Contains ("://")) {
// Android
Debug.Log("Its android");
WWW www = new WWW (sourcePath);
// Wait for download to complete - not pretty at all but easy hack for now
// and it would not take long since the data is on the local device.
while (!www.isDone) {;}
if (String.IsNullOrEmpty(www.error)) {
System.IO.File.WriteAllBytes(pathDB, www.bytes);
} else {
CanExQuery = false;
}
}
else {
// Mac, Windows, Iphone
//validate the existens of the DB in the original folder (folder "streamingAssets")
if (System.IO.File.Exists (sourcePath)) {
//copy file - alle systems except Android
System.IO.File.Copy (sourcePath, pathDB, true);
} else {
CanExQuery = false;
Debug.Log ("ERROR: the file DB named " + dbName + " doesn't exist in the StreamingAssets Folder, please copy it there.");
}
}
Открываю
private void Open ()
{
this.Open (pathDB);
}
private void Open (string path)
{
if (IsConnectionOpen) {
throw new SqliteException ("There is already an open connection");
}
if (sqlite3_open (path, out _connection) != SQLITE_OK) {
throw new SqliteException ("Could not open database file: " + path);
}
Debug.Log("path for connection"+ path);
IsConnectionOpen = true;
}
Ошибка происходить в этом методе, она связана с sqlite3_step(stmHandle), но я не пойму что являеться причиной.
public void ExecuteNonQuery (string query)
{
//Debug.Log(query);
if (!CanExQuery) {
Debug.Log ("ERROR: Can't execute the query, verify DB origin file");
return;
}
this.Open ();
if (!IsConnectionOpen) {
throw new SqliteException ("SQLite database is not open.");
}
try
{
IntPtr stmHandle = Prepare(query);
Debug.Log("sqlite3_step: " + sqlite3_step(stmHandle) + " SQLITE_DONE: " + SQLITE_DONE);
if (sqlite3_step(stmHandle) != SQLITE_DONE) {
IntPtr errorMsg = sqlite3_errmsg(_connection);
throw new SqliteException(Marshal.PtrToStringAnsi(errorMsg) + " Could not execute SQL statement. " + query);
}
Debug.Log("NullException");
Finalize(stmHandle);
}
catch(Exception e)
{
Debug.LogError(e);
}
this.Close ();
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости