Ваша проблема в том, что файл gransha.db не является допустимым файлом базы данных согласно
E/SQLiteLog: (26) file is encrypted or is not a database
Что происходит потомзаключается в том, что метод OpenOrCreate базы данных SQLite (который вызывается подклассом SQLiteOpenHelper) удаляет файл и создает пустую базу данных, поэтому при запуске после получения поврежденной базы данных вы получаете таблицу, которая не найдена.
Исправлениечтобы убедиться, что файл базы данных создан и сохранен с использованием инструмента SQLite (например, Db Browser для SQLite, DBeaver, SQLite Manager ....) перед копированием файла базы данных в папку активов, а затем удалить данные приложения (удалитьпустая, но действительная база данных) и перезапустить приложение.
На самом деле при тестировании вашего кода у вас есть проблема с методом checkUserExist, так как он не работает из-за того, что строки не заключены в кавычки, поэтому значения проверяются и123 должны быть именами столбцов (не с тестом, не являющимся именем столбца).
Так что вместо: -
String selection = "Driver_Number = " + dNum + " and Driver_Password = "+ dPass;
Вам необходимо использовать: -
String selection = '"Driver_Number = "' + dNum + " and Driver_Password = '"+ dPass + "'";
Однако, поскольку вы уже правильно настроили selectionArgs
, следует использовать следующее: -
public boolean checkUserExist (String dNum, String dPass){
String[] columns = {"Driver_Number"};
db = openDatabase();
//String selection = "Driver_Number = " + dNum + " and Driver_Password = "+ dPass; <<<< commented out
String selection = "Driver_Number=? AND Driver_Password=?"; //<<<< ?'s replaced by values in selectionArgs
String[] selectionArgs = {dNum, dPass};
Cursor cursor = db.query(DRIVERS_TABLE, columns, selection, selectionArgs, null, null, null);
int count = cursor.getCount();
cursor.close();
close();
if (count > 0) {
return true;
} else {
return false;
}
}
Thisэто рекомендуемый способ (полиция SQL-инъекций не вмешивается).Это твой код?в строке, которая заменяется в соответствии со значениями в аргументах (экранирование от вашего имени) на последовательной основе.т.е. первый?будет заменен первый аргумент, второй?по второму аргументу ..........
Я бы также предложил не использовать жестко закодированный путь к БД в соответствии с: -
private static final String DATABASE_PATH = "/data/data/com.example.b00694394.granshataxicompany2/databases/";
, а вместо этого заменить вышеуказанное на
private static DATABASE_PATH;
Наряду с изменением конструктора следующим образом: -
public Database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
DATABASE_PATH = context.getDatabasePath(DATABASE_NAME).getParent()+File.separator;
createDb();
}
Другое предложение заключается в упрощении checkDBExists, который также имеет преимущество в том, что не производит трассировку стека, когдаБаза данных не может быть открыта.
Таким образом, вместо checkDBExists вот альтернативный метод, который проверяет, существует ли файл: -
private boolean altCheckDBExist() {
File chkdb = new File(context.getDatabasePath(DATABASE_NAME).getPath());
return chkdb.exists();
}
Таким образом, вы бы использовали это, используя: -
public void createDb() {
/*
boolean dbExist = checkDbExist();
if (!dbExist){
this.getReadableDatabase();
copyDatabase();
}
*/
if (!altCheckDBExist()) {
this.getWritableDatabase();
copyDatabase();
}
}
- Обратите внимание, старый код оставлен, но закомментирован.
Протестировано с помощью Navicat
Я скачал бесплатную пробную версию Navicat (Navicat для SQLite3), создалбазы данных, добавил таблицу и данные, сохранил ее (закрытое соединение), скопировал файл в папку активов, запустил приложение (после удаления данных приложения) и все заработало.
Так что можно использовать Navicat, подробнее вопрос о том, как он используется.