Android SQLite исключение «нет такой таблицы» с внешней БД - PullRequest
0 голосов
/ 13 мая 2018

Я следовал нескольким учебникам по импорту внешней БД SQLite в приложении для Android, и похоже, что я делаю все «хорошо», но всегда получаю одну и ту же ошибку:

Caused by: android.database.sqlite.SQLiteException: no such table: games (code 1): , while compiling: SELECT * FROM games

Я создал БД на »Браузер БД для SQLite: Здесь

Я сохранил БД как «testDB.db» и поместил ее в папку «assets» Android Studio Project.

Здеськод:

public class DatabaseHelper extends SQLiteOpenHelper{

   private static String DB_NAME = "testDB.db";
   SQLiteDatabase mDb;
   private final Context myContext;

   //The Android's default system path
   private static String DB_PATH = "/data/data/com.example.jack.testimport/databases/";

   public DatabaseHelper(Context context) {
       super(context, DB_NAME, null, 1);
       this.myContext = context;
   }

   public void createDataBase() throws IOException{
       boolean dbExist = checkDataBase();
       if(dbExist){
           //do nothing - database already exist
       }else{
           mDb = this.getReadableDatabase();
           if (mDb.isOpen()){
               mDb.close();
           }

           try {
               copyDataBase();
           } catch (IOException e) {
               throw new Error("Error copying database");
           }
       }

   }


   public boolean checkDataBase(){
       File dbFile = myContext.getDatabasePath(DB_NAME);
       return dbFile.exists();
   }


   private void copyDataBase() throws IOException{
       InputStream myInput = myContext.getAssets().open(DB_NAME);

       String outFileName = DB_PATH + DB_NAME;

       OutputStream myOutput = new FileOutputStream(outFileName);

       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 void openDataBase() throws SQLException{
       String myPath = DB_PATH + DB_NAME;
       mDb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
   }

   @Override
   public synchronized void close() {
       if(mDb != null)
           mDb.close();
       super.close();
   }

   @Override
   public void onCreate(SQLiteDatabase db) {
   }

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

   //Query all data:
   public Cursor fetchGames(){
       return mDb.query("games", null,null,null,null,null,null);
   }

   public static String getDbName(){
       return DB_NAME;
   }

}

И из своей деятельности я вызываю этот метод:

int counter=0;
DatabaseHelper myDbHelper = new DatabaseHelper(ImportDatabase.this);

try {
   myDbHelper.createDataBase();
} catch (IOException ioe) {
   throw new Error("Unable to create database");
}
try {
    myDbHelper.openDataBase();
    counter=myDbHelper.fetchGames().getCount();
} catch (SQLException sqle) {
    throw sqle;
}

Счетчик всегда равен 0, и я получаю сообщение об ошибке поверх этого потока. Я попытался очистить / восстановитьпроект, удалить все данные и переустановить приложение, изменив путь, я следовал за всеми связанными вопросами (поэтому я надеюсь, что вы не сообщите об этом как дубликат), и т. д ... Я схожу с ума! Что я могу сделать, чтобыисправить эту ошибку?

Заранее спасибо.

1 Ответ

0 голосов
/ 13 мая 2018

Я проверил ваш код, работающий на моем устройстве. Но,

  1. Можете ли вы протестировать с помощью моего метода createDatabase следующие несколько строк кода?

    public void createDataBase() throws IOException{
        try
        {
            openDataBase();
        }catch(SQLException se)
        {
        }
    
        //if database does exists
        if(mDb != null)
        {
            //close it before open
            mDb.close();
        }
        else
        {
            //if the database does not exists..onCreate method will be called
            this.getReadableDatabase();
            //copy it from the assets directory.
            copyDataBase();
        }
    }
    
  2. Является ли com.example.jack.testimport именем вашего пакета в вашем AndroidManifest.xml?

Вы получите такое сообщение об ошибке, когда ваша база данных находится в другом месте, чем ваш пакет, например, 'com.example.jack'.

Ваша база данных должна быть

'/data/data/[package name in your AndroidManifest.xml]/databases/'

Я получил похожее сообщение с твоим. enter image description here

Я получил сообщение выше, когда мой путь к базе данных - «com.tobee.myapp.db», а расположение моего пакета - «com.tobee.myapp».

Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...