Android: long => SQLiteDatabase => long , 精度丢失

标签 android sqlite precision long-integer sqliteopenhelper

我正在创建一个应用程序,其中包含存储在 SQLite 数据库中的数据。我使用 long 作为主键(生成购买 java.util.UUID 的有效位)。我使用扩展的 SQLiteOpenHelper 处理数据库连接。查询:

INSERT INTO Categorys VALUES('-7311183930966261019', 'Mat', 'Matkonto', '#FFFFFF', '#F23341', '0', '231451', '0', '0', '');

没有问题,但是当我检索值时,第一个值 -7311183930966261019 中的很多精度都丢失了。查询

SELECT * FROM Categorys WHERE _id='-7311183930966261019';

返回空;

我在 sqlite3 和命令行中尝试了相同的查询,但没有遇到同样的问题,所以我得出结论,这个问题要么与 android 相关,要么与我的处理方式有关。

更新: 更正我现在的查询后:

INSERT INTO Categorys VALUES(-6645129292311215613, 'Sparande', 'Pengar som sparas inför framtiden', '#FFFFFF', '#F23341', '0', '231451', '0', 0, '');

我从数据库中得到(我类(class)的 toString()):

Category: name: Sparande; description: Pengar som sparas inför framtiden; colorLight: #FFFFFF; colorDark: #F23341 _id: -6645129292311215104

获取数据的代码:

public static List<Category> readCategorys(Context context){
    TransactionSQLOH helper = new TransactionSQLOH(context, DATABASE_NAME);
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.query(CategorySQLOH.TABLE_NAME, CategorySQLOH.COLUMNS, null, null, null, null, null);
    List<Category> result = CategorySQLOH.cursorToCategory(cursor);
    helper.close();
    return result;
}
public static List<Category> cursorToCategory(Cursor cursor){
    List<Category> result = new Vector<Category>();
    if (cursor == null || cursor.getCount() == 0){
        return result;
    }
    cursor.moveToFirst();
    Category c;
    do{
        long _id = cursor.getLong(cursor.getColumnIndex(CategorySQLOH.COLUMNS[0]));
        String name = cursor.getString(cursor.getColumnIndex(CategorySQLOH.COLUMNS[1]));
        String description= cursor.getString(cursor.getColumnIndex(CategorySQLOH.COLUMNS[2]));
        String colorLight = cursor.getString(cursor.getColumnIndex(CategorySQLOH.COLUMNS[3]));
        String colorDark = cursor.getString(cursor.getColumnIndex(CategorySQLOH.COLUMNS[4]));
        int destribution = cursor.getInt(cursor.getColumnIndex(CategorySQLOH.COLUMNS[5]));
        long categoryGroup =  cursor.getLong(cursor.getColumnIndex(CategorySQLOH.COLUMNS[6]));
        int intData =  cursor.getInt(cursor.getColumnIndex(CategorySQLOH.COLUMNS[7]));
        long longData  = cursor.getLong(cursor.getColumnIndex(CategorySQLOH.COLUMNS[8]));
        String strData = cursor.getString(cursor.getColumnIndex(CategorySQLOH.COLUMNS[9]));
        c = new Category(_id, name, description, colorLight, colorDark, destribution, categoryGroup, intData, longData, strData);
        result.add(c);
    }while(cursor.moveToNext());
    return result;
}

更新:

SELECT * FROM Category 的结果;在拉取的数据库上:

sqlite> SELECT * FROM Categorys;
-6.64512929231122e+18|Sparande|Pengar som sparas inf├Âr framtiden|#FFFFFF|#F2334
1|0|231451.0|0|0.0|

更新:

.schema 在拉取数据库上的结果。

CREATE TABLE Categorys ( _id REAL PRIMARY KEY, name TEXT NOT NULL, description T
EXT , colorLight TEXT , colorDark TEXT , destribution INTEGER , categoryGroup RE
AL , intData INTEGER , longData REAL , strData TEXT );
CREATE TABLE android_metadata (locale TEXT);

最佳答案

Android: long => SQLiteDatabase => long , precision lost

我想既然你将它定义为 LONG 我认为你需要删除单引号因为有了引号,SQLite 将它解释为几个字符而不是数字。

INSERT INTO Categorys VALUES(-7311183930966261019, 'Mat', ...);
SELECT * FROM Categorys WHERE _id = -7311183930966261019;

我自己测试过,一切正常。

关于Android: long => SQLiteDatabase => long , 精度丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623213/

相关文章:

c - double 地址转换

Android JNI - 'raw' 函数编译失败

android - 禁止 Android 发出 LogCat 消息

java - 如何sqlite + listview + onListItemClick启动新的Activity?光标读取错误

android - 在 SQLite 中查找记录时的 FC

sqlite - 如何在 Titanium 中将数据库导入 Navicat Lite 或 sqlitemanager

python - 无论输入类型如何,如何在Python中执行精确计算?

c - 使用 atan C 截断 double

android - 来自编辑文本字段的通知内容文本

android - 如何让 SNS 在 Android 中工作?