标签: android-sqlite

如何在sqllite事务中捕获异常 - java android

所以我正在为android编写一个数据库管理器,在该类中将是一个写入该数据库表的方法.

 SQLiteDatabase db = this.getReadableDatabase();
        db.beginTransaction();
        try {
          //DO some db writing
          db.setTransactionSuccessful();
        } finally {
          db.endTransaction();
        }
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果事务没有像在try中那样设置为成功,这将自动回滚数据,但是如果它不成功我如何捕获,以便我可以通知用户成功或回滚

android android-sqlite

5
推荐指数
1
解决办法
7394
查看次数

我可以安全地将完全随机的字符串(任何16位值)存储到SQLiteDB中吗?

我有一个用自定义密码创建的字符串,它可以有任何char值(0到0xFFFF).这个字符串是通过输入明文并用伪随机值旋转每个字符来创建的,所以我无法控制输出字符的含义.

我可以安全地存储和检索这个没有任何问题的SQLiteDatabase TEXT字段吗?

我认为Java使用UTF-16,所以我有点害怕像字符的NULL,END OF TEXT,ESCAPE,',",0xfeff / 0xfffe (BOM)出现在随机的地方到我的字符串等,我真的不知道SQLite的怎么会在内部存储这一点.如果它使用任何基于文本的标记来确定字段的开始和结束,我担心这会失败.

理想情况下,我想要退回我输入的完全相同的字符序列,以便我可以通过反向密码.

我将使用托管insert(ContentValues)方法SqLiteDatabase,所以我认为这将解决有关转义输入字符串的任何问题,但我仍然不相信这可以工作.

这是一个安全的操作,如果没有,我还应该做什么来存储我的加密字符串?

java sqlite android android-sqlite

5
推荐指数
1
解决办法
219
查看次数

Logcat说"无效列数据1"

新线程.SQL新手.获取联系信息的新手.所以我当然迷路了.如果我正确地读取这个logcat,它告诉我:列数据1不存在,或者我正在寻找错误的信息.不幸的是,这是一个"从我的错误中学习"的学习之路,我无法想象这一点.很感谢任何形式的帮助.

这里的目标是获取联系人的姓名,电话号码和电子邮件(按联系人ID匹配信息).

日志:

06-22 21:15:44.700: E/AndroidRuntime(1662): FATAL EXCEPTION: Thread-120
06-22 21:15:44.700: E/AndroidRuntime(1662): java.lang.IllegalArgumentException: Invalid column data1
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentResolver.query(ContentResolver.java:372)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentResolver.query(ContentResolver.java:315)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at sat.tuts4mobile.customlistview.ContactDetails$1.run(ContactDetails.java:53)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)

代码(它提取联系人ID 0的信息):

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;

/**
 * Created by Pete on 6/19/13.
 */
public class ContactDetails extends Activity {

    TextView …
Run Code Online (Sandbox Code Playgroud)

android android-contacts android-sqlite

5
推荐指数
1
解决办法
7495
查看次数

如何从phonegap android中的sqlite获取最后插入的行id

我正在创建一个应用程序,我在表中插入数据.在表中插入数据后,我想得到该行的id,以便我可以根据它进行进一步的操作.我试图使用sqlite的last_insert_rowid()函数,但没有找到运气.任何人都可以告诉哪个是最后一个插入行id的最佳方法.任何想法都表示赞赏.提前致谢.

lastinsertid cordova android-sqlite

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

SQLite使用默认值添加列

我在Android SQLite DB中工作.我正在将它从版本1升级到版本2.该onUpgrade方法按预期调用.

我的代码:

sqLiteDatabase.execSQL("ALTER TABLE " + Contracts.DateActivities.TABLE_NAME + " ADD COLUMN " + Contracts.DateActivities.C_GROUP + " INTEGER DEFAULT 0;");
Run Code Online (Sandbox Code Playgroud)

我一直得到同样的错误:

Caused by: android.database.sqlite.SQLiteException: near "group": syntax error (code 1): , while compiling: ALTER TABLE DateActivities ADD group INTEGER DEFAULT 0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我试过的其他变化:

sqLiteDatabase.execSQL("ALTER TABLE " + Contracts.DateActivities.TABLE_NAME + " ADD COLUMN " + Contracts.DateActivities.C_GROUP + " INTEGER DEFAULT 0;");
sqLiteDatabase.execSQL("ALTER TABLE " + Contracts.DateActivities.TABLE_NAME + " ADD COLUMN " + Contracts.DateActivities.C_GROUP + " int DEFAULT 0;"); …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite

5
推荐指数
1
解决办法
3405
查看次数

保持电话和佩戴数据库同步

目前我有一个创建两种模型的应用程序(我们称之为A和B).
A与B具有1:N的关系,现在我在掌上电脑和可穿戴设备中都有一个数据库来存储这些模型.

问题是,我需要同步这两个数据存储,我不完全确定如何实现这一点.我看过许多文档引用了dataApi,他们建议你将数据保存在DataItem对象中,每次磨损连接时都会同步.
我对这种方法不是100%肯定的是:

  • DataApi是可靠的数据存储吗?(足以在手持设备和磨损中替换SQLite数据库)
  • DataApi可以支持搜索操作(例如,对象A具有的所有B对象)吗?如果是这样,你怎么能进行搜索?
  • 考虑到每个DataItem对应一个实体,我可以节省多少DataItems的限制?

关于这个主题的文档目前似乎有点缺乏,所以我不确定DataApi是否是我需要的正确实现,或者我是否必须在消息中将原始数据发送到同步数据库.

android-sqlite android-wear-data-api wear-os

5
推荐指数
1
解决办法
667
查看次数

已收集的对象无法评估ContentValues.values.tostring()

任何人都可以告诉我这是什么.我在数据库中添加数据时出现此错误.它只发生在一个特定的行上.我试着通过互联网找到答案或理由.但是徒劳无功 截图 调试时的屏幕截图

public void FunSetVisitorDetails(String strResult) {
    Log.d(TAG, "Get Visitor Details started.");
    if (!strResult.equalsIgnoreCase("NA") && !strResult.equalsIgnoreCase("NI")) {
        SQLiteDatabase database = getWritableDatabase();
        database.delete("TBL_VISITOR_MASTER", null, null);
            String[] strResultData = strResult.split("#");
            for (int index = 0; index < strResultData.length; index++) {
                String[] strRowData = strResultData[index].split(",");
                ContentValues values = new ContentValues();
                values.put("VISITORID", strRowData[0]);
                values.put("MEMBERID", strRowData[1]);
                values.put("TEAMID", strRowData[2]);
                values.put("CATEGORY", strRowData[3]);
                values.put("NAME", strRowData[4]);
                values.put("COMPNAME", strRowData[5]);
                values.put("SPECIALIZED1", strRowData[6]);
                values.put("SPECIALIZED2", strRowData[7]);
                values.put("SPECIALIZED3", strRowData[8]);
                values.put("SPECIALIZED4", strRowData[9]);
                values.put("SPECIALIZED5", strRowData[10]);
                values.put("CLIENT1", strRowData[11]);
                values.put("CLIENT2", strRowData[12]);
                values.put("CLIENT3", strRowData[13]);
                values.put("CLIENT4", strRowData[14]);
                values.put("CLIENT5", strRowData[15]);
                values.put("ASK", …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite content-values

5
推荐指数
1
解决办法
5270
查看次数

从Sqlite游标创建Pojo类花费了太多时间

我的查询执行时间<3毫秒.但问题是,我正在从查询执行中获得的游标中创建一个pojo类对象.此字段的对象创建和设置值花费的时间超过140毫秒.Pojo类有大约36个字段.有任何建议可以解决这个问题.

谢谢

performance android database-performance android-sqlite android-recyclerview

5
推荐指数
1
解决办法
131
查看次数

“ try-with-resources语句”是否真的适用于android Cursor对象?

自Java从1.7开始引入该语句以来,我就采用了以下规则来编写与光标相关的语句,如下所示:

try (Cursor cursor = context.getContentResolver().query(queryAccountUri, null, null, null, null)) {
            if (cursor != null && cursor.moveToFirst()) {
                entry.userId = cursor.getString(0);
                entry.account = cursor.getString(1);
                entry.phone = cursor.getString(2);
                entry.nickName = cursor.getString(3);
                entry.icon = cursor.getString(4);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

但是,这些天,我们的测试人员不断通知我,该语句在运行猴子测试时仍然导致内存泄漏,或者如果对此方法进行循环测试,甚至会耗尽所有内存。cursor由于某些NOT CLOSING问题,所有日志文件都表明该对象是凶手。因此,我必须更改代码以cursor手动关闭对象,如下所示:

try {
            if (cursor.moveToFirst()) {
                entry.userId = cursor.getString(0);
                entry.account = cursor.getString(1);
                entry.phone = cursor.getString(2);
                entry.nickName = cursor.getString(3);
                entry.icon = cursor.getString(4);
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        } finally {
            try …
Run Code Online (Sandbox Code Playgroud)

java android cursor try-with-resources android-sqlite

5
推荐指数
0
解决办法
907
查看次数

Loader <Cursor>仅加载选定的行+下一行

在活动A中,我正在加载一个包含我表中所有值的列表,并设置了一个setOnItemClickListener来启动活动B并通过发送数据发送带有所选项的id [ 1 ] 的uri

[ 1 ] Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);

在活动B中,我的onCreateLoader包含投影:

String[] projection = {
       TestEntry._ID,
       TestEntry.COLUMN_TEST_ONE,
       TestEntry.COLUMN_TEST_TWO}
Run Code Online (Sandbox Code Playgroud)

...带有return语句

return new CursorLoader(this,  
    mCurrentTestUri, //Got this from Activity A         
    projection,             
    null,                   
    null,                   
    null);  
Run Code Online (Sandbox Code Playgroud)

我的onLoadFinished看起来像这样:

if (cursor.moveToFirst()) {
      int oneColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
      int twoColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_TWO);

      String currentOne = cursor.getString(oneColumnIndex);
      String currentTwo = cursor.getString(twoColumnIndex);

      textViewOne.setText(currentOne);
      textViewTwo.setText(currentTwo);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,现在我希望显示下一行(右下方)的值,但是使用不同的投影(我只需要_ID和COLUMN_TEST_ONE)并且onLoadFinished显示COLUMN_TEST_ONE的值textViewThree.

[两行的值应该同时显示,而不是一个或另一个]

我可以使用[ …

sqlite android android-cursorloader android-loader android-sqlite

5
推荐指数
1
解决办法
295
查看次数