1

SQLite データベースに格納されたデータを含むアプリを作成しています。主キーとして長いものを使用します(Java.util.UUIDの重要なビットを購入して生成されます)。拡張された SQLiteOpenHelper を使用してデータベース接続を処理します。クエリ:

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

問題なく通過しますが、値を取得すると、最初の値 -7311183930966261019 の多くの精度が失われています。クエリ

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

null を返します。

私はsqlite3とコマンドラインで同じクエリを試しましたが、同じ問題は発生しなかったので、問題はAndroidまたは途中での処理に関連していると結論付けました.

更新:クエリを修正した後、次のようになりました。

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

そして、データベースから取得します(クラスから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 カテゴリの結果。プルされたデータベース:

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);
4

1 に答える 1

1

Android: long => SQLiteDatabase => long 、精度が失われました

単一引用符を削除する必要があると思うように定義LONGしたので、引用符を使用すると、SQLiteはそれを数字ではなく2文字として解釈するためだと思います。

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

私はそれを自分でテストしましたが、すべてが機能します。

于 2013-03-25T19:53:21.687 に答える