Исключение Android SQLite для некоторых устройств / населенных пунктов

#android #sqlite

#Android #sqlite

Вопрос:

У меня есть живое приложение для Android в PlayStore; он считывает данные из SQLite и отображает конец интерфейса. Он отлично работает на устройствах семьи и друзей в Великобритании. Однако приложение не будет запущено для одного устройства в Индии и одного устройства в Пакистане.

Вот определение пути к базе данных в классе SQLiteOpenHelper:

 private static String DB_PATH = "/data/data/com.deenbook.arabixlite/databases/";
private static final String DATABASE_NAME = "ATDB3";
  

Вот трассировка стека, которую я получил с помощью Play Console:

Исключение SQLiteException в Database.getProps

Трассировка стека:

Трассировка стека

Вот мой класс базы данных:

     package com.deenbook.arabixlite;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static String DB_PATH = "/data/data/com.deenbook.arabixlite/databases/";

    private static final String DATABASE_NAME = "ATDB3";

    private static SQLiteDatabase myDataBase;

    private static Context context= null;

    private static String LANGUAGE;

    public Database(Context context, String source, boolean override, String lang) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
        this.LANGUAGE= lang;

        try {
            createDataBase(source, override);
        } catch (IOException ex) {

        }
    }


    public void createDataBase(String source, boolean override) throws IOException {

        boolean dbExist = checkDataBase();

        if(override)
        {
            copyDataBase();
            return;
        }
        if(dbExist)
        {
        }
        else {
            this.getReadableDatabase();

            try {
                copyDataBase();
            } catch (IOException e) {

                throw new Error("DBH Error copying database: " source);
            }
        }
    }

    public boolean executeSQLBatch(ArrayList<String> sql)
    {
        boolean ok= true;
        for(int i=0; i<sql.size(); i  )
        {
            if(executeSQL(sql.get(i))==false)
            {
                ok= false;
            }
        }

        return ok;
    }

    public boolean executeSQL(String sql) {
        boolean ok= true;
        try {

            SQLiteDatabase db = getWritableDatabase();

            db.execSQL(sql);

            db.close();

        } catch (Exception e) {
            ok= false;
            e.printStackTrace();
        }

        return ok;
    }

    private boolean checkDataBase() {

        SQLiteDatabase checkDB = null;

        try {
            String myPath = DB_PATH   DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            // database does't exist yet.
        }

        if (checkDB != null) {

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }

    private void copyDataBase() throws IOException {

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

        // Path to the just created empty db
        String outFileName = DB_PATH   DATABASE_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 static void openDataBase(String source) throws SQLException {

        String myPath = DB_PATH   DATABASE_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

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

        super.close();

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > newVersion)
        {
            try{
                copyDataBase();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public ArrayList<String[]> getProps()
    {
        ArrayList<String[]> data= new ArrayList<String[]>();

        String sql= "Select * from ARABIX_PROPS";

        try {
            openDataBase("getProps");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        Cursor cursor = myDataBase.rawQuery(sql, null);

        if (cursor.moveToFirst()) {
            do {
                String KEY= cursor.getString(0);
                String VALUE= cursor.getString(1);

                String[] kvp= new String[]{KEY, VALUE};

                data.add(kvp);

            } while (cursor.moveToNext());
        }

        myDataBase.close();


        return data;
    }


    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub

    }
}
  
  • оба телефона, на которых была эта ошибка, работают на Android 9
  • Я просто не понимаю, почему это работает на некоторых устройствах, а не на других ..?

Пожалуйста, помогите ..!!

Комментарии:

1. Поместите полный журнал и трассировку стека в вопрос.

2. OhhhThatVarun — это вся информация, которая у меня есть. У меня нет проблемы на моем собственном устройстве. Кроме того, трассировка стека, которую я включил выше, доступна только в виде изображения.

3. Ну, нам нужно больше, чем это. И какая строка 263? Если это новое приложение, то почему вы не используете RoomDB?

4. Ohhhhatvarun — строка 263 — это строка в методе getProps. Это: Cursor cursor = MyDatabase.rawQuery(sql, null); Кроме того, спасибо за предложение RoomDB — должен признать, я никогда не слышал об этом раньше…