标签: android-sqlite

为什么insertWithOnConflict(...,CONFLICT_IGNORE)返回-1(错误)?

我有一个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)

android android-sqlite

22
推荐指数
1
解决办法
1万
查看次数

引起:android.database.sqlite.SQLiteException:没有这样的表:(代码1)Android

我们的应用程序中有一个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 android-sqlite

22
推荐指数
4
解决办法
6万
查看次数

可以在单个execSQL查询中指定的SQL变量的限制是多少

我正在努力提高我的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)

sqlite android android-sqlite

21
推荐指数
2
解决办法
8014
查看次数

Android SQLite数据库和应用更新

我开发了一个Android应用程序并发布了1.0版本.该应用程序包含带有5个表的SQLite本地数据库.

现在我们计划发布2.0版本,同时更新1.0版用户.在2.0版本中,我们已经包含了前面5个表的额外两个表,现在有7个表.

现在我的问题是,版本1.0的用户都在本地数据库中有一些数据,如果他更新到版本2.0,以前的数据会丢失吗?如果是这样的话.那么替代方法是什么?

sqlite android android-contentprovider android-sqlite

21
推荐指数
1
解决办法
2万
查看次数

为我的应用指定max sqlite db size.如何处理db完全异常

我在面试中被问到如何为我们的Android应用程序设置sqlite db的最大大小.我们如何处理最大尺寸?

编辑:Marina Lynn的回答似乎可以接受这个问题.但是当db大小达到我们指定的极限附近时,是否会触发某种侦听器?(或类似的东西)

sqlite android android-sqlite

20
推荐指数
2
解决办法
4708
查看次数

是否应该为数据库中的每个表都有一个SQLiteOpenHelper?

有一个大的SQLiteOpenHelper子类为数据库中的每个表定义onCreateonUpgrade方法,或者最好有多SQLiteOpenHelper个子类,每个表一个?

有最好的做法吗?或者都是可以接受的,但有不同的好的和坏的副作用?

database android android-sqlite

20
推荐指数
2
解决办法
7257
查看次数

如何在sdcard上直接存储sqlite数据库

我想在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以便进一步访问?

sqlite android android-sqlite

20
推荐指数
1
解决办法
3万
查看次数

每个活动开始后显示 SQLiteConstraintException 错误

我一直在 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)

android android-sqlite

20
推荐指数
1
解决办法
6876
查看次数

如何在Android中重置SqLite数据库?

我希望我的用户能够重置应用程序,然后我需要重置我创建的SQLite数据库.我怎样才能做到这一点?我想重置数据库或删除并重新创建数据库.

sqlite android android-sqlite

18
推荐指数
2
解决办法
4万
查看次数

CursorLoader和AsyncTaskLoader之间的区别

我为什么要使用AsyncTaskLoader,何时应该更喜欢CursorLoader,反之亦然?

在官方页面中,显示了App-listing示例,它使用AsyncTaskLoader而不是CursorLoader.

这两者有哪些优缺点?我在某处读到了CursorLoader没有关注内容更改(在sqlite中).

谢谢!

android android-asynctask android-cursorloader android-sqlite

18
推荐指数
1
解决办法
5669
查看次数