#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 — должен признать, я никогда не слышал об этом раньше…