2013-03-25 71 views
1

我正在創建一個包含存儲在SQLitedatabase中的數據的應用程序。我使用長鍵作爲主鍵(生成購買java.util.UUID的重要位)。我使用擴展的SQLiteOpenHelper處理數據庫連接。查詢:Android:long => SQLiteDatabase => long,precision lost

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

經過沒有問題,但是當我找回價值很多的第一個值-7311183930966261019精度,已丟失。查詢

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

返回null;

我已經在sqlite3和命令行中嘗試過相同的查詢,並沒有得到同樣的問題,所以我得出結論,這個問題要麼與android或我的處理方式有關。

更新: 修正querys後,我現在有:

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 Categorys的結果;在拉數據庫:

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); 
+0

插入後您是否傾銷了該數據庫以查看哪些值在哪些列中?你說精度是列表,但是這裏沒有直接的證據,那就是發生了什麼。 – 2013-03-25 19:54:32

+0

不,我只讀了我查詢數據庫時返回的內容。 – SverkerSbrg 2013-03-25 20:04:15

+0

在這一點上,你正在沒有任何證據的情況下假設這個問題。轉儲數據庫行並檢查行的實際值。 – 2013-03-25 20:28:08

回答

1

的Android版本:長=> SQLiteDatabase =>長,精度丟失

我想,既然你把它定義爲LONG我認爲你需要刪除單引號,因爲引號,SQLite的解釋它作爲幾個字符而不是數字。

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

我自己測試它,一切正常。

+0

我沒有意識到差異,但我仍然得到精度損失:S – SverkerSbrg 2013-03-25 20:00:07

+0

@SverkerSbrg它非常有趣,請在這裏添加一些代碼片段,以瞭解如何檢索來自db的數據。 – Sajmon 2013-03-25 20:09:42

+0

感謝您抽出時間。我可以補充說,每次調用數據庫時都會出現損失,並且輸入和結果之間的確切差異(無論查詢的類型如何)。如果我嘗試使用相同的ID獲取插入的數據,我會將它找到,但是使用'錯誤'編號 – SverkerSbrg 2013-03-25 20:20:59

相關問題