检索sqlite android中插入的数据时出错

检索sqlite android中插入的数据时出错,android,sqlite,Android,Sqlite,你好,Stack社区 我一直在开发一个与SQLite数据库交互频繁的应用程序。我需要在DB中插入一个声音作为BLOB。我认为我的做法是正确的,就像这样: byte[] fileContent = getSoundInBytes(filesDir+item.getListItemId()); ContentValues values = new ContentValues(); values.put("FileId", item.getContentFileId()); values.put("C

你好,Stack社区

我一直在开发一个与SQLite数据库交互频繁的应用程序。我需要在DB中插入一个声音作为BLOB。我认为我的做法是正确的,就像这样:

byte[] fileContent = getSoundInBytes(filesDir+item.getListItemId());
ContentValues values = new ContentValues();
values.put("FileId", item.getContentFileId());
values.put("Content", fileContent);
long x = db.insert("Files", null, values);
x的值是准确的,它正好是序列中正确的数字,单位为DB

但是。。。。。奇怪的是,当我试着看唱片是否在那里时,它说它不在那里。这样的查询:

public boolean isIDPresentInFiles(String fileId)
    {
         boolean isIdPresent = false;
         String query = "SELECT Count(FileId) as Count FROM Files " +
                        " where FileId = "+fileId;
         Cursor c = db.rawQuery(query, null);


         if (c.moveToFirst())
         {
            do{
                isIdPresent = c.getInt(c.getColumnIndex("Count"))>0;
            }while(c.moveToNext());
         }
         c.close();
         return isIdPresent;
    }
因此isIdPresent返回false。不要担心db close,因为我在for循环的末尾单独执行它,因为我不想通过在循环的每个周期打开和关闭连接来锁定db

最让我吃惊的是,如果我使用Mozilla sqlite管理器直接在DB中执行查询,它返回的TrueCount大于0

Pffff对这个问题真的很疲惫。我已经为这项任务编写了大量代码,但是我被这个未知、奇怪的东西阻止了,它不想走正确的路

编辑:这是一个日志:

07-20 16:46:55.123: E/file dir(11086): /data/data/package/files/sounds/tmp/X'635B35811DF5C148A61A5651FFF79C97BB5E'/
07-20 16:46:55.183: E/AndroidRuntime(11086): FATAL EXCEPTION: main
07-20 16:46:55.183: E/AndroidRuntime(11086): Process: package, PID: 11086
07-20 16:46:55.183: E/AndroidRuntime(11086): android.database.sqlite.SQLiteConstraintException: column FileId is not unique (code 19)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at package.db.AllEntityDBHandler.insertNewLanguage(AllEntityDBHandler.java:776)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at package.fragments.FragmentNewLanguage$3.onClick(FragmentNewLanguage.java:125)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.view.View.performClick(View.java:4438)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.view.View$PerformClick.run(View.java:18422)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.os.Handler.handleCallback(Handler.java:733)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.os.Looper.loop(Looper.java:136)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at android.app.ActivityThread.main(ActivityThread.java:5001)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at java.lang.reflect.Method.invokeNative(Native Method)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at java.lang.reflect.Method.invoke(Method.java:515)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-20 16:46:55.183: E/AndroidRuntime(11086):    at dalvik.system.NativeStart.main(Native Method)

此日志属于一个方法,该方法是在检查数据库中是否存在id后执行的,检查返回False,这意味着记录不存在,但奇怪的是,当另一个方法尝试插入认为不存在的记录时,DB说它就在那里。

我认为这个项目在您第一次运行时运行良好。当您第二次运行它时,会出现错误,因为FileId是您的主键,并且id为1的行已经插入到您的数据库中

要消除错误,请执行以下操作之一:

您在查询中遗漏了一个引号,因为fileId是String,所以请使用

String query = "SELECT Count(FileId) as Count FROM Files where FileId = '" + fileId + "'";
但建议的解决方案是使用参数化查询作为

Cursor c = db.query("Files", new String[] { "FileId" }, "FileId" + "=?",
            new String[] { fileId }, null, null, null, null);
并检查isIdPresent作为


fileId是字符串,需要用单引号将其括起来。为什么你要用字符串作为ID?谢谢你,伙计,它工作了,我还是不明白为什么它不想用我的方式工作,当它在DB中工作时。尽管如此,你的提议还是可以的。现在,我正在尝试检查BLOB文件是否在DB中,以及是否可以检索它。非常感谢。
Cursor c = db.query("Files", new String[] { "FileId" }, "FileId" + "=?",
            new String[] { fileId }, null, null, null, null);
if (c!= null && c.getCount() > 0) {
    isIdPresent = true;
}
c.close();
return isIdPresent;