2013-11-29 2 views
4

Я прочитал решение от Failed to change locale for db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' to 'en_US', но это мне не помогает. У меня все еще такая же ошибка.Не удалось открыть базу данных/Не удалось изменить локаль для (базы данных) в 'en_US'

Это мой класс DBHelper. Не могли бы вы заглянуть в нее и помочь мне?

package com.example.mgr; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.sql.Date; 
import java.util.ArrayList; 


import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBHelper extends SQLiteOpenHelper{ 

    //The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/com.example.mgr/databases/"; 

    private static String DB_NAME = "Mgr.Test.db"; 

    private SQLiteDatabase myDataBase; 

    private final Context myContext; 

    public static final String KEY_ROWID = "_id"; 

    public static final String KEY_DATE = "DataWstawiena"; 

    public static final String KEY_TRESC = "Tresc"; 

    public static final String DATABASE_NAME = "Mgr.Test"; 

    public static final String DATABASE_TABLE = "InformacjeZDziekanatu"; 
    private static int DATABASE_VERSION = 18; 
    /** 
    * Constructor 
    * Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
    * @param context 
    */ 
    public DBHelper(Context context) { 

     super(context, DB_NAME, null, DATABASE_VERSION); 
     System.out.println("------Odpalam DBHelpera---wolane z konstruktora----"); 
     this.myContext = context; 
    } 

    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 
     System.out.println("----Baza istnieje: " + dbExist + "-----"); 

     if(dbExist){ 
      System.out.println("----Baza istnieje!"); 
      this.getReadableDatabase(); 
      System.out.println("----Baza istnieje! znow"); 
      //do nothing - database already exist 
     } 
     dbExist = checkDataBase(); 
     if(!dbExist){ 
      System.out.println("----Baza nie istnieje"); 

      //By calling this method and empty database will be created into the default system path 
       //of your application so we are gonna be able to overwrite that database with our database. 
      this.getReadableDatabase(); 

      try { 
       System.out.println("Bede kopiowal"); 
       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 
     } 

    } 

    /** 
    * Check if the database already exist to avoid re-copying the file each time you open the application. 
    * @return true if it exists, false if it doesn't 
    */ 
    private boolean checkDataBase(){ 

     SQLiteDatabase checkDB = null; 
     System.out.println("----Baza istnieje w checkDB!"); 
     try{ 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS|SQLiteDatabase.OPEN_READONLY); 
      System.out.println("Bazka otwarta!"); 

     }catch(SQLiteException e){ 

      System.out.println("database does't exist yet"); 

     } 

     if(checkDB != null){ 
      System.out.println("Zamykam baze"); 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 
    } 

    /** 
    * Copies your database from your local assets-folder to the just created empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
    private void copyDataBase() throws IOException{ 

     //Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DB_NAME; 

     //Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 

     //transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     //Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public SQLiteDatabase openDataBase() throws SQLException{ 

     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS|SQLiteDatabase.OPEN_READONLY); 
     return myDataBase; 
    } 

    @Override 
    public synchronized void close() { 

      if(myDataBase != null) 
       myDataBase.close(); 

      super.close(); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(" ----Jestem w mtodzie onUpgrade------"); 
     //DATABASE_VERSION++; 

    } 

    /** 
    * Wykonuje zapytanie SQL 
    * @param query - zapytanie SQL 
    * @return zwraca Stringa z rezultatem 
    */ 
    public String executeQuery(String query){ 
    String result = ""; 
    Cursor cursor = myDataBase.rawQuery(query, null); 
    String dataWs ="Data Wstawienia "; 
    String tresc = "Tresc"; 
    result = dataWs + tresc + "\n"; 
    if(cursor.moveToFirst()) 
    { 
    do 
    { 
    result += cursor.getString(1) +" "+ cursor.getString(3)+"\n"; 
    }while(cursor.moveToNext()); 
    } 

    return result; 
    } 

    /** 
    * Wykonuje zapytanie SQL i zwraca tablice 
    * @param query - zapytanie SQL 
    * @return zwraca tablie Stringa z rezultatem 
    */ 
    public ArrayList<String> executeQueryTab(String query){ 
    ArrayList<String> result = new ArrayList<String>(); 
    Cursor cursor = myDataBase.rawQuery(query, null); 
    String dataWs ="Data Wstawienia "; 
    String tresc = "Tresc"; 
    result.add(dataWs + tresc); 
    if(cursor.moveToFirst()) 
    { 
    do 
    { 
    result.add(cursor.getString(1) +" "+ cursor.getString(3)); 
    }while(cursor.moveToNext()); 
    } 

    return result; 
    } 


     // Add your public helper methods to access and get content from the database. 
     // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy 
     // to you to create adapters for your views. 

} 

Он работал отлично, но я сделал некоторые обновления базы данных, а затем прекратил работу. Я предполагаю, что это источник этой ошибки, но я не уверен.

Заранее благодарен!

По вашему запросу:

меня вызвать метод CreateDatabase в моем классе MainActivity, как вы можете увидеть ниже:

package com.example.mgr; 

import java.io.IOException; 
import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.view.Gravity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Adapter; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener { 

    SharedPreferences preferences; 
    TextView tv; 
    Adapter adapter; 
    SQLiteDatabase as; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button infDlaStudButton = (Button) findViewById(R.id.infDlaStud); 
     Button infDlaKandButton = (Button) findViewById(R.id.infDlaKand); 
     preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     DBHelper myDbHelper = new DBHelper(this); 
     infDlaStudButton.setOnClickListener(this); 
     infDlaKandButton.setOnClickListener(this); 

     infDlaKandButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       ble(); 

      } 

     }); 

     infDlaStudButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ble(); 
      } 
     }); 

     try { 
      myDbHelper.createDataBase(); 
      System.out.println("Stworzyłam bazę danych"); 

     } catch (IOException ioe) { 

      throw new Error("nie moge to create database"); 

     } 
     System.out.println("bede otwierdal baze danych w glowej metodzie"); 

     myDbHelper.openDataBase(); 

    } 

    void ble() { 
     Intent intent = new Intent(); 
     intent.setClass(MainActivity.this, SecondActivity.class); 
     startActivity(intent); 
    } 

    @Override 
    public void onClick(View arg0) { 
     Toast.makeText(this, "ble", Toast.LENGTH_LONG).show(); 
     // TODO Auto-generated method stub 

    } 

} 

Да, таблица android_metadata существует в базе данных, и имеет 'ru_US' значение.

Я создал новую, очень простую базу данных Drzewo.db. Когда эта таблица имеет только 2 таблицы: andoid_metadata и еще один (Przyjeci), тогда все работает! Но позже я добавил новую таблицу и попытался сделать обновление, и у меня такая же ошибка.

Есть мои журналы (с этой новой базы данных):

12-04 19:58:41.959: E/SQLiteLog(2293): (11) database corruption at line 50741 of [00bb9c9ce4] 
12-04 19:58:41.959: E/SQLiteLog(2293): (11) database corruption at line 50780 of [00bb9c9ce4] 
12-04 19:58:41.969: E/SQLiteLog(2293): (11) statement aborts at 16: [SELECT locale FROM android_metadata UNION SELECT NULL ORDER BY locale DESC LIMIT 1] 
12-04 19:58:42.056: E/SQLiteDatabase(2293): Failed to open database '/data/data/com.example.mgr/databases/Drzewo.db'. 
12-04 19:58:42.056: E/SQLiteDatabase(2293): android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.example.mgr/databases/Drzewo.db' to 'en_US'. 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:386) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:854) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at com.example.mgr.DBHelper.createDataBase(DBHelper.java:53) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at com.example.mgr.MainActivity.onCreate(MainActivity.java:73) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.Activity.performCreate(Activity.java:5104) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.os.Looper.loop(Looper.java:137) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at dalvik.system.NativeStart.main(Native Method) 
12-04 19:58:42.056: E/SQLiteDatabase(2293): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed (code 11) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.nativeExecuteForString(Native Method) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:367) 
12-04 19:58:42.056: E/SQLiteDatabase(2293):  ... 28 more 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): Couldn't open Drzewo.db for writing (will try read-only): 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.example.mgr/databases/Drzewo.db' to 'en_US'. 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:386) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:854) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at com.example.mgr.DBHelper.createDataBase(DBHelper.java:53) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at com.example.mgr.MainActivity.onCreate(MainActivity.java:73) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.Activity.performCreate(Activity.java:5104) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.os.Looper.loop(Looper.java:137) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.app.ActivityThread.main(ActivityThread.java:5041) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at java.lang.reflect.Method.invokeNative(Native Method) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at java.lang.reflect.Method.invoke(Method.java:511) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at dalvik.system.NativeStart.main(Native Method) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed (code 11) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.nativeExecuteForString(Native Method) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:367) 
12-04 19:58:42.219: E/SQLiteOpenHelper(2293): ... 28 more 
12-04 19:58:42.259: D/AndroidRuntime(2293): Shutting down VM 
12-04 19:58:42.280: W/dalvikvm(2293): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
12-04 19:58:42.359: E/AndroidRuntime(2293): FATAL EXCEPTION: main 
12-04 19:58:42.359: E/AndroidRuntime(2293): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mgr/com.example.mgr.MainActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 5 to 6: Drzewo.db 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.os.Looper.loop(Looper.java:137) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at dalvik.system.NativeStart.main(Native Method) 
12-04 19:58:42.359: E/AndroidRuntime(2293): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 5 to 6: Drzewo.db 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:245) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at com.example.mgr.DBHelper.createDataBase(DBHelper.java:53) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at com.example.mgr.MainActivity.onCreate(MainActivity.java:73) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.Activity.performCreate(Activity.java:5104) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
12-04 19:58:42.359: E/AndroidRuntime(2293):  ... 11 more 

Я работаю на затмениеЮнона + Android 4.2.2

+0

Я не эксперт, но только мысль. Возможно, обновление вызвало изменение в пути базы данных? – user1807337

+1

Нет, никаких изменений. Я только что скопировал новую базу данных в папку assert. Ничего больше. – k4sia

+0

Мне нужно знать, где вы вызываете createDatabase(), пожалуйста, обновите свой код. –

ответ

1

Вероятно файл базы данных на самом деле поврежден. Вы можете попытаться открыть его sqlitebrowser

Кроме того, вы можете выполнить некоторые другие проверки и попытаться восстановить его на случай, если он поврежден, если вы устанавливаете sqlite на свой компьютер. Вы можете следить за этим шаги:

  1. Получить SQLite here и установить его
  2. Открыть команду А добавить путь к SQLite oyour environnment переменной пути, чтобы запускать SQLite команды везде
  3. Перейдите в каталог, где у вас есть база данных, а также запускать SQLite:

    sqlite3 yourfile.db 
    
  4. вы можете проверить целостность базы данных по:

    pragma integrity_check; 
    
  5. Если в нем говорится, что файл в порядке, то мы потеряны! Если он поврежден, попробуйте восстановить его.

Иногда лучшее решение для поврежденной базы данных sqlite3 является простой, но эффективный: дамп и восстановление

  1. Экспорт данных в файл SQL: имя файла

    echo .dump | sqlite3.exe yourdbname.db > yourdbname.sql 
    
  2. Изменить mv yourdbname.db yourdbname.db.original

  3. Создайте новая база данных с вашим sql.

    sqlite3.exe -init yourdbname.sql yourdbname.db 
    
  4. Открыть новый файл с помощью обозревателя sqlite и посмотреть, что произойдет!

2

Я не мог поставить все эти коды в комментариях, поэтому, пожалуйста, попробуйте следующее: Имейте в виду, что я не добавляю все шаблоны ... нормально?

Изменить CheckDB метод:

private boolean checkDataBase(){ 
    File dbFile = new File(DATABASE_PATH, DATABASE_NAME); 
    return dbFile.exists(); 
} 

Изменить CREATEDB метод:

public void createDataBase() { 
    if(checkDb()){ 
     //do nothing 
    } else { 
     copyDatabase(); 
    } 
} 

Изменить copyDatabase() метод:

private void copyDataBase(){ 
     getReadableDatabase(); 

     //add the rest of your current implementation 

} 

Изменить доступность вашего конструктора к приватным и добавить эти методы :

private DBHelper mInstance = null; 
public static DBHelper getInstance(Context context) { 
    if(mInstance == null) 
     mInstance = new DBHelper(context) 
    return mInstance; 
} 
//remove the old openDatabase method 
public SQLiteDatabase openDatabase() { 
    return getReadableDatabase(); //or you can use getWritableDatabase(); 
} 

Кроме того, я заметил, что ваша версия db в размещенном коде составляет 18, а в журналах, которые вы разместили, говорится 5 или 6? Можете ли вы опубликовать последние журналы ...

+1

К сожалению, это не поможет. Спасибо, в любом случае! – k4sia

2

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

Вы можете получить путь к базе данных с context.getDatabasePath();, вы передадите искомое имя в файл (независимо от того, существует он или нет). А на самом деле вы должны сделать это таким образом

Для этого, в любом месте вы используете что-то вроде String outFileName = DB_PATH + DB_NAME; вы должны изменить его для

String outFileName =myContext.getDatabasePath(DB_NAME).getPath() ; 

и это реальное правильное местоположение для файла. так, ваш copyDataBase() будет как этого

private void copyDataBase() throws IOException { 

    // Open your local db as the input stream 
    InputStream myInput = context.getAssets().open("db/" + DATABASE_NAME); 

    // Path to the just created empty db 
    String outFileName =myContext.getDatabasePath(DB_NAME).getPath() ; 

    // Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 

    // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

и те же изменения в вашей private boolean checkDataBase()

+0

К сожалению, это не поможет. После всех попыток я думаю, что проблема может быть в моей базе данных. Во всяком случае, большое спасибо за ваше решение. – k4sia

0

попробовать это

db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READWRITE); 
Смежные вопросы