2013-03-25 1 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 null;

Я пробовал одни и те же запросы в sqlite3 и в командной строке и не получал такую ​​же проблему, поэтому я пришел к выводу, что проблема связана либо с Android, либо с моей обработкой на этом пути.

Update: После исправления 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| 

Update:

результат .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

Вы сбросили эту базу данных после вставки, чтобы узнать, какие значения указаны в столбцах? вы говорите, что точность - это список, но прямых доказательств здесь нет, это то, что происходит. –

+0

Нет, я только что прочитал, что вернулся, когда я обращаюсь к базе данных. – SverkerSbrg

+0

В этом пункте вы делаете предположение о проблеме без каких-либо доказательств. удалите строки DB и проверьте фактическое значение строки. –

ответ

1

Android: длинный => SQLiteDatabase => долго, точность потерял

Я думаю, что так как вы определили его как LONG я думаю, что вам нужно, чтобы удалить одиночные кавычки, потому что с кавычками, SQLite толкует это как пара символов, а не как число.

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

Я проверил его сам и все работает.

+0

Я не знал о различии, но я все равно получаю прецизионную потерю: S – SverkerSbrg

+0

@SverkerSbrg это очень интересно, добавьте здесь некоторый фрагмент кода, как вы извлекаете данные от db. – Sajmon

+0

Спасибо, что нашли время. Я могу добавить, что потеря появляется при каждом вызове базы данных и с той же точной разницей между входом и результатом (независимо от типа запроса). Если я попытаюсь извлечь вставленные данные с тем же идентификатором, что и я, то он найдет его, но с «неправильным» идентификатором – SverkerSbrg