Получить данные из базы данных Android ошибка - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь использовать базу данных sqlite, но проблема показывает «нет такой таблицы», код работает на некоторых устройствах, а некоторые показывают это сообщение.

class DatabaseHelper extends SQLiteOpenHelper {

    private final String mDatabaseName;
    private final Context mContext;
    private final String mPath;

    DatabaseHelper(Context context, String database, String path){
        super(context,database,null,1);
        this.mContext=context;
        this.mDatabaseName=database;
        this.mPath=path;
        _createDatabase();

    }

    private void _createDatabase() {
        if(_checkDatabase()){
            return;
        }
        getReadableDatabase();
        try {
            _copyDatabase();
        }catch (Exception e){
        }
    }

    private void _copyDatabase() throws IOException {
        InputStream inputStream = mContext.getAssets().open(mDatabaseName);
        FileOutputStream fileOutputStream = new FileOutputStream(mPath+mDatabaseName);
        byte[] bytes = new byte[1024];
        do{
            int n;
            if((n=inputStream.read(bytes)) <= 0){
                fileOutputStream.flush();
                fileOutputStream.close();
                return;
            }
            fileOutputStream.write(bytes,0,n);
        }while (true);

    }

    private boolean _checkDatabase() {
        return mContext.getDatabasePath(mDatabaseName).exists();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }
}

И адаптер базы данных выглядит так

class DatabaseAdapter
{
    private SQLiteDatabase database;
    private DatabaseHelper databaseHelper;


    DatabaseAdapter(Context context, String database, String path){
        databaseHelper = new DatabaseHelper(context, database, path);
    }

    void open(){
        try{
            database = databaseHelper.getReadableDatabase();
        }
        catch (SQLiteException e)
        {
            database = databaseHelper.getReadableDatabase();
        }
    }
    boolean isOpened()
    {
        return this.database != null && this.database.isOpen();
    }

    Cursor _get_rows()
    {
        Cursor cursor = database.rawQuery("SELECT * FROM rows ORDER BY RANDOM() LIMIT 4;", null);
        cursor.moveToFirst();
        return cursor;
    }
}

И контроллер базы данных выглядит так

public class DatabaseController {
    private static DatabaseAdapter databaseAdapter;

    public static Cursor _get_rows()
    {
        if(!databaseAdapter.isOpened()){
            databaseAdapter.open();
        }
        return databaseAdapter._get_rows();
    }

    public static void initilization(Context activity) {
        String dbName=  "data.db";
        databaseAdapter = new DatabaseAdapter(activity.getApplicationContext(),dbName,"/data/data/"+activity.getApplicationInfo().packageName+"/databases/");
    }

}

Я использую в таких действиях, как это

DatabaseController.initilization(this);
        Cursor c = DatabaseController._get_rows();

Я не мог найти решение этой проблемы, база данных уже была скопирована ввесь каталог

1 Ответ

0 голосов
/ 26 ноября 2018

Я подозреваю, что проблема в том, что вы перехватываете исключение в: -

private void _createDatabase() {
    if(_checkDatabase()){
        return;
    }
    getReadableDatabase();
    try {
        _copyDatabase();
    }catch (Exception e){
    }
}

Таким образом, обработка продолжается, и создается пустая база данных и, следовательно, нет таблицы.

Основная причинаВозможно, каталог баз данных не существует.Вам нужно посмотреть на исключение, которое было захвачено, чтобы определить точную ошибку.например, e.printStackTrace();

Ниже описано, как можно создать каталог баз данных (чтобы устранить исключение ENOENT (No such file or directory), которое может быть проблемой): - например,

private void _copyDatabase() throws IOException {
    File dir = new File(mPath); //<<<<<<<<<< ADDED
    if(!dir.exists()) { //<<<<<<<<<< ADDED
        dir.mkdirs(); //<<<<<<<<<< ADDED
    } //<<<<<<<<<< ADDED
    InputStream inputStream = mContext.getAssets().open(mDatabaseName);
    FileOutputStream fileOutputStream = new FileOutputStream(mPath+mDatabaseName);
    byte[] bytes = new byte[1024];
    do{
        int n;
        if((n=inputStream.read(bytes)) <= 0){
            fileOutputStream.flush();
            fileOutputStream.close();
            return;
        }
        fileOutputStream.write(bytes,0,n);
    }while (true);
}

Это также не рекомендуетсяк путям жесткого кода, например, используя: -

databaseAdapter = new DatabaseAdapter(activity.getApplicationContext(),dbName,"/data/data/"+activity.getApplicationInfo().packageName+"/databases/");

Лучше получить путь, используя метод контекста getDatabasePath .

  • Обратите внимание, что кодкод принципа, он не был протестирован или запущен и поэтому может содержать ошибки.
  • Обратите внимание на устройства, на которых у вас возникли проблемы, вам потребуется удалить базу данных (очистить данные приложения или удалить приложение) перед запускомлюбой исправленный код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...