我想在缓存中创建一个数据库,以便在用户点击Clear cache
按钮时将其清除。
在SQLiteOpenHelper
构造函数中,只有传递数据库名称的参数,而不是目录(默认为dadabases
)。
当用户想要清除缓存时,是否有删除此类数据库的选项?
答案 0 :(得分:4)
以下是在缓存目录中创建数据库的示例:
public class CachedDatabase extends SQLiteOpenHelper {
public CachedDatabase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, new File(context.getCacheDir(), name).getAbsolutePath(), factory, version);
}
@Override public void onCreate(SQLiteDatabase db) {
// just for testing
db.execSQL("CREATE TABLE example (id INTEGER PRIMARY KEY AUTOINCREMENT, foo, bar, baz, qux)");
}
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
您需要做的就是将绝对路径作为构造函数中的name参数传递。
经测试只是为了确保它是在/ data / data / [package_name] / cache:
中创建的CachedDatabase cachedDatabase = new CachedDatabase(this, "TEST", null, 1);
SQLiteDatabase database = cachedDatabase.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("foo", "foo");
values.put("bar", "bar");
values.put("baz", 123);
values.put("qux", true);
database.insert("example", null, values);
检查数据库:
$ adb shell
$ run-as [YOUR_PACKAGE_NAME]
$ ls cache
TEST
TEST-journal
答案 1 :(得分:1)
您可以在特定位置创建和打开数据库,但需要使用SQLiteDatabase类(选择openOrCreateDatabase
方法之一):正如您所提到的,您无法创建使用提供的SQLiteOpenHelper在不同路径中的数据库。
您还可以修改SQLiteOpenHelper的代码以满足您的需求。从链接中获取源代码,复制到项目的新类中并修改getDatabaseLocked
方法。
您还可以从SQLiteAssetHelper获取灵感。
答案 2 :(得分:-1)
如果您要清除表R
G
B
B
G
R
//...
您也可以删除表db.execSQL("delete * from "+ TABLE_NAME);