我只是在Android中设置SQLite表的基础知识,但是我无法存储/检索任何值。我无法判断我是否在存储或检索方面失败 - 只是因为我无法返回任何值。这就是我在做的事情:
现在我只有一个包含两列的表(实际上有三列包括id字段)。第1列是文件名,第2列是我想要存储的md5哈希值。所以,如果从应用程序的某个地方,我称之为:
String fileName = "image.png"
String md5 = "c32005e7c4929527ff67727a24430bc0"
MyDB db = new MyDB(getApplicationContext());
System.err.println("setting md5 for " + fileName + ": " + md5);
int returnValue = db.setSDCardFileMetadata(fileName, md5);
db.closeDatabase();
然后我应该看到System.err.println
输出,因为在相应的SQLite数据库方法中设置和检索了这个值,如下所示:
setting md5 for image.png: c32005e7c4929527ff67727a24430bc0
inserting row for: image.png: c32005e7c4929527ff67727a24430bc0
Verifying image.png: c32005e7c4929527ff67727a24430bc0 ###
但相反,我正在看到它:
setting md5 for image.png: c32005e7c4929527ff67727a24430bc0
inserting row for: image.png: c32005e7c4929527ff67727a24430bc0
no matching file found on sd card: image.png
Verifying image.png: ###
看看getter函数是如何找不到匹配值的?我不知所措。这对我来说都很好看。谁能看到我的错误?谢谢!
public class MyDB {
/* The index (key) column name for use in where clauses. */
public static final String KEY_ID = "_id";
/* Tables and db information */
private static final String DB_NAME = "MyDB.db";
private static final int DB_VERSION = 1;
private static final String SDCARD_FILES_TABLE = "SDCARD_FILES_TABLE";
/* The name and column index of each column in the database */
private static final String FILE_NAME_COLUMN = "FILE_NAME_COLUMN";
private static final String MD5_COLUMN = "MD5_COLUMN";
/* Database open/upgrade helper */
private static MyDBOpenHelper myDBOpenHelper;
public MyDB(Context context) {
myDBOpenHelper = new MyDBOpenHelper(context, DB_NAME, null, DB_VERSION);
}
public static SQLiteDatabase getDB() {
SQLiteDatabase db = myDBOpenHelper.getWritableDatabase();
return db;
}
/* Called when we no longer need access to the database. */
public void closeDatabase() {
myDBOpenHelper.close();
}
public int setSDCardFileMetadata(String file, String md5hash) {
SQLiteDatabase db = myDBOpenHelper.getWritableDatabase();
ContentValues newValues = new ContentValues();
newValues.put(FILE_NAME_COLUMN, file);
newValues.put(MD5_COLUMN, md5hash);
System.err.println("inserting row for: " + file);
int returnValue = (int) db.insert(SDCARD_FILES_TABLE, null, newValues);
System.err.println("Verifying " + file + ": " + getSDCardFileMD5Hash(file) + " ###");
return returnValue;
}
public String getSDCardFileMD5Hash(String file) {
SQLiteDatabase db = myDBOpenHelper.getReadableDatabase();
String where = FILE_NAME_COLUMN + "= ?";
Cursor cursor = db.query(SDCARD_FILES_TABLE, new String[] {MD5_COLUMN}, where, new String[] {file}, null, null, null);
if (cursor.getCount() == 1) {
cursor.moveToFirst();
return cursor.getString(0);
}
System.err.println("no matching file found on sd card: " + file);
return "";
}
private static class MyDBOpenHelper extends SQLiteOpenHelper {
public MyDBOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
/* SQL Statement to create a metadata table for files stored on the sd card */
private static final String SDCARD_FILES_TABLE_CREATE = "create table " +
SDCARD_FILES_TABLE + " (" + KEY_ID +
" integer primary key autoincrement, " +
FILE_NAME_COLUMN + " text not null, " +
MD5_COLUMN + " text not null);";
/* Create the new database */
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SDCARD_FILES_TABLE_CREATE);
System.err.println(SDCARD_FILES_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
db.execSQL("DROP TABLE IF IT EXISTS " + SDCARD_FILES_TABLE);
onCreate(db);
}
}
}
答案 0 :(得分:0)
函数getSDCardFileMD5Hash
未正确检查现有记录;如果有多个匹配记录,则条件getCount() == 1
将失败。
您应该使用if (cursor.moveToFirst())
。
要防止首先将多个相同的记录插入到数据库中,请确保对要检查的列有UNIQUE
约束,而不是insert
,请使用{{ 3}} (..., CONFLICT_IGNORE)
。