- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个报价应用程序,其中使用 SqlLite 数据库来存储报价。当用户打开应用程序时,它将数据从 Assets 复制到数据库。它在所有版本中都工作正常,但在 Android P 中,它在应用程序启动时崩溃。
它给了我这样的错误
android.database.sqlite.SQLiteException: no such table: quotes (code 1 SQLITE_ERROR): , while compiling: SELECT COUNT(qu_text) AS count FROM quotes
我确信数据库不会被复制,因此不会出现表错误,但它仅适用于 Android P。其他版本工作正常。
我的DBHandler.java如下所示
public class DBHandler extends SQLiteOpenHelper {
private static String DB_PATH;
private static String DB_NAME = "xxx";
private SQLiteDatabase myDataBase;
private final Context myContext;
DBHandler(Context context) {
super(context, DB_NAME, null, constant.DATABASE_VERSION);
this.myContext = context;
DB_PATH = context.getDatabasePath(DB_NAME).toString();
}
void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
Log.e("database","exist");
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
// database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
// ==============================================================================
void openDataBase() throws SQLException {
String myPath = DB_PATH;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
// ==============================================================================
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
// ==============================================================================
@Override
public void onCreate(SQLiteDatabase db) {
}
// ==============================================================================
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
DAO.java 类具有如下功能
private void open() throws SQLException {
if(database!=null&&database.isOpen())return;
database = dbHandler.getWritableDatabase();
}
private void closeDAO(){
synchronized (lockObj){
if(dbHandler!=null)dbHandler.close();
dbHandler=null;
database=null;
}
}
public static void dispose(){
if(dBObject!=null){
dBObject.closeDAO();
}
dBObject=null;
}
正如一位用户在回答中所说,我在复制数据库之前尝试像下面这样关闭数据库连接,但仍然出现相同的错误。
private void copyDataBase() throws IOException {
SQLiteDatabase db = getReadableDatabase();
db.close();
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
如果有人可以帮助解决这个难题,请告诉我。谢谢
最佳答案
这是 Android P 中的预期行为。您可以在此处阅读详细信息 https://issuetracker.google.com/issues/80268903
要解决此问题,应用程序必须确保在复制文件之前没有与数据库的打开连接。
关于java - 没有这样的表: quotes (code 1 SQLITE_ERROR) : Android P,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52567582/
我在 iOS 应用程序中有一个函数,它从数据库中读取一些数据。功能极其简单: -(void) readCategories { sqlite3 *database; if([[NSFi
如果我想将这些表行放在一起,则会出现以下错误 [SQLITE_ERROR] SQL错误或缺少数据库(输入不完整) 每个人都单独工作。 SELECT x.ActionListId, x.wordinde
我正在尝试使用 Android Room并在关注 this tutorial 之后尝试构建应用程序时出现以下错误: Error:(23, 27) error: 查询有问题:[SQLITE_ERROR]
我正在尝试使用外键创建一个数据库,但我一直收到 no such column: created_at 的错误,即使我没有在代码中的某处使用 created_at 。我想知道为什么以及如何修补这个问题。
我已经为此工作了几个小时,必须让它工作!它阻碍了 iPhone 应用程序的发布...我第一次使用 SQLite。我已遵循所有建议,但我的 sqlite3_prepare_v2 调用每次都会收到 SQL
我正在使用 SQLite3我有一个列,但错误表明未创建列“未定义”。 const SQLite = require('sqlite3').verbose(); const db = new SQLit
我正在编写一个简单的服务器/客户端来跟踪用户登录的次数。用户可以创建一个帐户并将他们的计数设置为 1。后续登录将增加他们在后端 SQLITE3 中的计数数据库。 在下面的示例中,我运行了“添加”函数,
我正在将 Sequelize 与 sqlite 一起使用,当我尝试向表中插入数据时出现错误 Executing (default): INSERT INTO `Users` (`id`,`userna
我正在为我的数据库使用 Sequelize (6.3.0) 和 sqlite3 (4.2.0),我正在尝试定义以下模型: this.define("giveaways", {
这是我的第一个问题。 我正在使用 Room 数据库构建应用程序,并尝试关注 this教程,因为我需要实现多对多关系。 但是,当我尝试构建应用程序时,我不断收到以下错误: 错误:查询有问题:[SQLIT
我正在尝试将 SQLite 与 Java 结合使用,这是第一次将两者结合使用,代码如下: package db; import java.sql.Connection; import java.sql
试图获取一个包含日期和相关注释的表格。我正在发送请求以获取表格和数据,日期 = 我决定的任何内容。 我收到以下错误: E/AndroidRuntime: FATAL EXCEPTION: main
我试图从数据库中获取 rowid,其中有人与刚刚写消息的人具有相同的用户名。当我更改时代码可以工作 WHERE creator` =${member.username} to WHERE match
当我使用flutter并创建表时,出现以下错误! : error DatabaseException(incomplete input (code 1 SQLITE_ERROR): , while c
[SQLITE_ERROR] SQL error or missing database (near "(": syntax error) try { String sql = "SELECT
我已经编写了sequelizer迁移javascript来对表中的现有列进行更改,但是当我运行命令sequelizer db:migrate,它给出了错误 == 20170212050240-alte
我正在尝试使用新的房间库,但出现此错误 Error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing da
我正在使用 sequelize 和 sqlite 在 dicord.j 沙中制作一个不和谐的机器人来制作数据库。它有一个货币系统,当有人在特定 channel 发帖时,我收到了这个错误 Sequeli
我正在尝试在新创建的 SQLite 数据库中创建一个表。由于某种原因,我收到 SQLException: try { logger.debug("Trying to create ta
我有一个报价应用程序,其中使用 SqlLite 数据库来存储报价。当用户打开应用程序时,它将数据从 Assets 复制到数据库。它在所有版本中都工作正常,但在 Android P 中,它在应用程序启动
我是一名优秀的程序员,十分优秀!