2013-02-10 3 views
0

У меня есть предварительно заполненная база данных в папке с ресурсами, которую я перехожу во внутреннее хранилище при первом запуске. Он отлично работает на некоторых устройствах, но на некоторых возникает следующая ошибка: sqlite returned: error code = 1, msg = no such table: FTSgesla, db=/data/data/com.example.enigmar/databases/gesla Указанная таблица определенно существует, поэтому я не знаю, где проблема.SQLite возвращен: код ошибки = 1

код SQLiteOpenHelper:

public static class DictionaryOpenHelper extends SQLiteOpenHelper 
{ 

    private final Context mHelperContext; 
    private SQLiteDatabase mDatabase; 

    //private static String DB_PATH="/data/data/com.example.enigmar/databases/"; 
    private static String DB_PATH=""; 
    private static final String DB_NAME = "gesla"; 

    DictionaryOpenHelper(Context context) 
    { 
     super(context, DB_NAME, null, 1); 
     // 
     DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
     // 
     this.mHelperContext = context; 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 


    } 


    public void createDataBase() throws IOException 
    { 

     boolean mDataBaseExist = checkDataBase(); 

     if(!mDataBaseExist) 
     { 
      this.getReadableDatabase(); 
      this.close(); 
      new Thread(new Runnable() 
      { 
       public void run() 
       { 
        try 
        { 
         copyDataBase(); 
         Log.e(TAG, "createDatabase database created"); 
         BAZA_NAREJENA=true; 
        } 
        catch (IOException e) 
        { 
         throw new RuntimeException(e); 
        } 
       } 
      }).start(); 

     } 

    } 

    private boolean checkDataBase() 
    { 

     File dbFile = new File(DB_PATH + DB_NAME); 
     return dbFile.exists(); 

    } 

    private void copyDataBase() throws IOException 
    { 

     InputStream mInput = mHelperContext.getAssets().open(DB_NAME); 
     //final Resources resources = mHelperContext.getResources(); 

     String outFileName = DB_PATH + DB_NAME; 

     OutputStream mOutput = new FileOutputStream(outFileName); 
     //InputStream mInput = resources.openRawResource(R.raw.gesla); 

     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer))>0) 
     { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 

     } 

    public boolean openDataBase() throws SQLException 
    { 

     String mPath = DB_PATH + DB_NAME; 
     mDatabase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     return mDatabase != null; 
    } 


    @Override 
    public synchronized void close() { 

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

    super.close(); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

} 

}

Что не так?

ответ

1

В вашем public void createDataBase() вы используете Thread для копирования своей базы данных. Вы уверены, что закончили копирование, прежде чем пытаться получить к нему доступ? Это моя рабочая копия кода, который очень похож на ваш, вы можете захотеть see. Другое дело

byte[] mBuffer = new byte[1024]; 

попробуйте 4096, у меня были проблемы с 1024 раньше.

0

Проверьте, что таблица действительно существует в базе данных. Скорее всего, фактическая база данных пуста, так как вы не делаете ничего в функции onCreate (где нужно инициализировать базу данных). Вместо этого вы, вероятно, одно из следующего:

Вместо передачи SQLiteDatabase.CREATE_IF_NECESSARY на номер openDatabase, позвоните по телефону (в настоящее время не используется) createDataBase.

В качестве альтернативы, создайте базу данных в onCreate, скопировав данные базы данных по умолчанию. Для этого вам понадобится другая функция для преобразования существующей базы данных в базе данных в команды SQL.

+0

Он импортирует из существующей базы данных. Следовательно, onCreate ничего не требует. – wtsang02

Смежные вопросы