我有一个SQLite表:
CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name));
Run Code Online (Sandbox Code Playgroud)
还有一些Android代码:
Validate.notBlank(region);
ContentValues cv = new ContentValues();
cv.put(Columns.REGION_NAME, region);
long regionId =
db.insertWithOnConflict("regions", null, cv, SQLiteDatabase.CONFLICT_IGNORE);
Validate.isTrue(regionId > -1,
"INSERT ON CONFLICT IGNORE returned -1 for region name '%s'", region);
Run Code Online (Sandbox Code Playgroud)
在重复行上insertWithOnConflict()返回-1,表示错误,然后Validate抛出:
INSERT ON CONFLICT IGNORE returned -1 for region name 'Overseas'
Run Code Online (Sandbox Code Playgroud)
该ON冲突文档的SQLite(重点煤矿)规定:
当发生适用的约束冲突时,IGNORE解析算法会跳过包含约束违规的一行,并继续处理SQL语句的后续行,就像没有出错一样.包含约束违例的行之前和之后的其他行将正常插入或更新.使用IGNORE冲突解决算法时不会返回错误.
在Android的insertWithOnConflict()文件规定:
如果输入参数'conflictAlgorithm'= CONFLICT_IGNORE则返回新插入行的行ID或现有行的主键,如果有任何错误,则返回-1
CONFLICT_REPLACE不是一个选项,因为替换行将更改其主键而不是仅返回现有键:
sqlite> INSERT INTO regions (name) VALUES ("Southern");
sqlite> INSERT INTO regions (name) VALUES ("Overseas");
sqlite> …Run Code Online (Sandbox Code Playgroud) 我们的应用程序中有一个sqlite数据库.它适用于所有用户,但很少有人遇到Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings错误.
下面是我的sqlite帮助程序类,用于创建db和错误日志.在assert/Master.db我们有表 generalSettings.但在将其复制到设备后,表格丢失了.这种情况仅发生在少数用户身上.我搜索了解决方案,但我找不到确切的解决方案.团队请帮我解决这个问题.
码:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class InstallDB extends SQLiteOpenHelper {
Context ctx;
String DBNAME;
String DBPATH;
Modules modObj = new Modules();
public InstallDB(Context context, String name) {
super(context, name, null, 1);
this.ctx = context;
this.DBNAME = name;
this.DBPATH …Run Code Online (Sandbox Code Playgroud) 我正在努力提高我的android数据库插入速度.我目前正在做的是生成一个字符串,如:
SELECT ? as title, ? as musician_id, ? as album_id, ? as genre
UNION SELECT ?, ?, ?, ?
UNION SELECT ?, ?, ?, ?
UNION SELECT ?, ?, ?, ?
UNION SELECT ?, ?, ?, ?
UNION SELECT ?, ?, ?, ?
Run Code Online (Sandbox Code Playgroud)
然后执行它
SQLiteDatabase database = //initialized in some way
String insertQuery; // the string of the query above
String [] parameters; // the parameters to use in the insertion.
database.execSQL(insertQuery.toString(), parameters);
Run Code Online (Sandbox Code Playgroud)
当我尝试插入大约2000行时,我收到以下错误:
Caused by: android.database.sqlite.SQLiteException: too many …Run Code Online (Sandbox Code Playgroud) 我开发了一个Android应用程序并发布了1.0版本.该应用程序包含带有5个表的SQLite本地数据库.
现在我们计划发布2.0版本,同时更新1.0版用户.在2.0版本中,我们已经包含了前面5个表的额外两个表,现在有7个表.
现在我的问题是,版本1.0的用户都在本地数据库中有一些数据,如果他更新到版本2.0,以前的数据会丢失吗?如果是这样的话.那么替代方法是什么?
我在面试中被问到如何为我们的Android应用程序设置sqlite db的最大大小.我们如何处理最大尺寸?
编辑:Marina Lynn的回答似乎可以接受这个问题.但是当db大小达到我们指定的极限附近时,是否会触发某种侦听器?(或类似的东西)
有一个大的SQLiteOpenHelper子类为数据库中的每个表定义onCreate和onUpgrade方法,或者最好有多SQLiteOpenHelper个子类,每个表一个?
有最好的做法吗?或者都是可以接受的,但有不同的好的和坏的副作用?
我想在sdcard而不是默认路径中创建我的sqlite数据库...我想从sdcard访问我的所有数据我也使用此代码:
private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase.openOrCreateDatabase("/sdcard/"+DATABASE_NAME,null);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "
+ TABLE_NAME
+ " (id INTEGER PRIMARY KEY, name TEXT, number TEXT, skypeId TEXT, address TEXT, image BLOB)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
当我在默认路径中看到数据库文件时,我可以看到所有数据和表,但是当我看到在SD卡中创建的数据库文件时,它不会显示任何数据,但它只显示数据库文件
在构造函数中,它只在sdcard中创建文件,但在默认路径中它可以很好地完成所有工作.....如何在SD卡上存储所有Sqlitedata以便进一步访问?
我一直在 logcat 中弹出这个错误。它总是在每次活动更改后显示。有时,该应用程序会消失,并在一秒钟内再次显示。logcat中没有任何致命错误,我看到的是:
2020-05-20 11:53:26.422 2940-8484/? E/SQLiteDatabase: Error inserting flex_time=3324000 job_id=-1 period=6650000 source=16 requires_charging=0 preferred_network_type=1 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService user_id=0 target_package=com.google.android.gms tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG task_type=0 required_idleness_state=0 service_kind=0 source_version=201516000 persistence_level=1 preferred_charging_state=1 required_network_type=0 runtime=1589968406417 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} last_runtime=0
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067 SQLITE_CONSTRAINT_UNIQUE)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:879)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:88)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1599)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1468)
at aplm.a(:com.google.android.gms@201516038@20.15.16 (120406-309763488):76)
at aplb.a(:com.google.android.gms@201516038@20.15.16 (120406-309763488):173)
at aplb.a(:com.google.android.gms@201516038@20.15.16 (120406-309763488):21)
at aplb.a(:com.google.android.gms@201516038@20.15.16 (120406-309763488):167)
at aphk.run(:com.google.android.gms@201516038@20.15.16 (120406-309763488):8)
at sob.b(:com.google.android.gms@201516038@20.15.16 (120406-309763488):12)
at sob.run(:com.google.android.gms@201516038@20.15.16 (120406-309763488):7)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at sub.run(:com.google.android.gms@201516038@20.15.16 …Run Code Online (Sandbox Code Playgroud) 我希望我的用户能够重置应用程序,然后我需要重置我创建的SQLite数据库.我怎样才能做到这一点?我想重置数据库或删除并重新创建数据库.
我为什么要使用AsyncTaskLoader,何时应该更喜欢CursorLoader,反之亦然?
在官方页面中,显示了App-listing示例,它使用AsyncTaskLoader而不是CursorLoader.
这两者有哪些优缺点?我在某处读到了CursorLoader没有关注内容更改(在sqlite中).
谢谢!
android android-asynctask android-cursorloader android-sqlite