Вопрос:
Я делаю приложение, которое копирует db файл из другого приложения, а затем редактирует db.
Когда я пытаюсь открыть SQLite db, я получаю сообщение об ошибке:
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
Пробовал много разных подходов, которые я видел в ИНТЕРНЕТЕ, и ничего не работает.
Вот мой код:
public class FirstRunService extends IntentService{ /** * Creates an IntentService. Invoked by your subclass constructor. * * Service Used to name the worker thread, important only for debugging. */ public FirstRunService() { super(«Service»); } String filesdir; SharedPreferences sp; @Override protected void onHandleIntent(Intent intent) { //Cargo SharedPreferences sp = this.getSharedPreferences(«FirstRun», Context.MODE_PRIVATE); //Asigno filesdir filesdir = intent.getStringExtra(«filesdir»); //Subo XX Boolean XX = sp.getBoolean(«XX»,false); if(!XX) { uploadxxs(intent); } } protected void uploadXX (Intent intent){ //Preparo SQLiteDatabase db; myFTP myftp = new myFTP(); FTPClient client; //Copio la Base de datos RootTools.deleteFileOrDirectory(filesdir + «/XX.db», true); RootTools.copyFile(«/data/data/com.XX/databases/XX.db», filesdir+»/xx.db»,true,false); try { RootTools.getShell(true).add(cmd); } catch (TimeoutException e) { e.printStackTrace(); Log.e(«Root XX.db»,»Fallo»); FirstRunAlarm.completeWakefulIntent(intent); stopService(intent); } catch (RootDeniedException e) { e.printStackTrace(); Log.e(«Root XX.db»,»Fallo»); FirstRunAlarm.completeWakefulIntent(intent); stopService(intent); } catch (IOException e) { e.printStackTrace(); Log.e(«Root XX.db»,»Fallo»); FirstRunAlarm.completeWakefulIntent(intent); stopService(intent); } //Edito db //Edito db File file = new File(filesdir+»/wa.db»); if (file.exists()){ Log.e(«File»,»Existe»); db = SQLiteDatabase.openDatabase(filesdir+»/wa.db», null,SQLiteDatabase.OPEN_READWRITE);//Error in this line }else{ db = null; Log.e(«File»,»No Existe»); } db.execSQL(«DROP TABLE android_metadata;»);
Logcat:
12-17 22:38:17.401 15227-15242/com.lstupenengo.primeraapp E/File﹕ Existe 12-17 22:38:17.402 3076-3366/com.lstupenengo.primeraapp E/SQLiteLog﹕ (14) cannot open file at line 30192 of [00bb9c9ce4] 12-17 22:38:17.402 3076-3366/com.lstupenengo.primeraapp E/SQLiteLog﹕ (14) os_unix.c:30192: (13) open(//data/data/com.lstupenengo.primeraapp/files/XX.db) — 12-17 22:38:17.412 3076-3366/com.lstupenengo.primeraapp E/SQLiteDatabase﹕ Failed to open database ‘data/data/com.lstupenengo.primeraapp/files/XX.db’. android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) at com.lstupenengo.primeraapp.FirstRunService.uploadXX(FirstRunService.java:105) at com.lstupenengo.primeraapp.FirstRunService.onHandleIntent(FirstRunService.java:49) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:212) at android.os.HandlerThread.run(HandlerThread.java:61) 12-17 22:38:17.412 3076-3366/com.lstupenengo.primeraapp W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x41648d88) 12-17 22:38:17.422 3076-3366/com.lstupenengo.primeraapp E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[Service] Process: com.lstupenengo.primeraapp, PID: 3076 android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) at com.lstupenengo.primeraapp.FirstRunService.uploadXX(FirstRunService.java:105) at com.lstupenengo.primeraapp.FirstRunService.onHandleIntent(FirstRunService.java:49) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:212) at android.os.HandlerThread.run(HandlerThread.java:61)
манифеста:
<?xml version=»1.0″ encoding=»utf-8″?> <manifest xmlns:android=»http://schemas.android.com/apk/res/android» package=»com.lstupenengo.primeraapp» > <uses-permission android:name=»android.permission.WAKE_LOCK»/> <uses-permission android:name=»android.permission.INTERNET»/> <uses-permission android:name=»android.permission.ACCESS_NETWORK_STATE»/> <uses-permission android:name=»android.permission.ACCESS_SUPERUSER»/> <uses-permission android:name=»android.permission.WRITE_EXTERNAL_STORAGE»/> <application android:allowBackup=»true» android:icon=»@drawable/ic_launcher» android:label=»@string/app_name» android:theme=»@style/AppTheme» > <activity android:name=».MainActivity» android:label=»@string/app_name» > <intent-filter> <action android:name=»android.intent.action.MAIN» /> <category android:name=»android.intent.category.LAUNCHER» /> </intent-filter> </activity> <receiver android:name=».FirstRunAlarm»/> <service android:name=».FirstRunService»/> </application> </manifest> Ответ №1
Сначала проверьте, существует или не используется файл базы данных:
File file = new File(myPath); if (file.exists() && !file.isDirectory()) Ответ №2
Решается путем создания класса, а затем вызывает этот класс непосредственно из службы.
Класс
public class xxHandler extends SQLiteOpenHelper { Context context; SQLiteDatabase xxdb; public wadbHandler(Context context1) { super(context1,»xx.db», null, 1); context = context1; } // Creating Tables @Override public void onCreate(SQLiteDatabase db) { } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void accion(SQLiteDatabase db){ wadb = SQLiteDatabase.openDatabase(context.getFilesDir()+»/xx.db», null, SQLiteDatabase.OPEN_READWRITE); wadb.execSQL(«SELECT * FROM table;») } Ответ №3
Добавить перед OpenDatabase:
file.setWritable(true);