拥有一个非常大的 SQLiteOpenHelper,并为我所有的人提供保存方法
实体太可怕了。
你认为好的指定应用程序只有几行代码吗?
在Android 中,从SQLiteOpenHelper 扩展是最好的选择。它包含了所有必需的逻辑,并且在我看来使用它非常舒服。但一切都需要正确实施。
多次扩展 SQLiteOpenHelper 是错误的,无法正常工作
SQLiteOpenHleper 很可能没有问题,但我认为错误的实现和使用。
你的意思是,ORM 框架,例如 ORMLite 是不允许的,所以我的建议是使用 SQLiteOpenHelper 并进行正确和干净的实现。
更新:
7 种保存方法。 7种更新方法。 7 删除方法。 7 选择方法。
从数据库中获取其他数据的许多其他方法。是不是最好的
选择?
我在 cmets 中的意思是,这是实施问题。您真的不需要 7 个表以上的 7 个保存方法。这是我的第一个想法。如何创建一种通用方法?
public class DataSourceTools {
private SQLiteOpenHelper handler;
private SQLiteDatabase db;
public DataSourceTools(SQLiteOpenHelper handler) {
this.handler = handler;
}
public void saveObject(String table, ContentValues data) {
try {
db = openWrite(this.handler);
if (db != null) {
db.insert(table, nullColumnHackName, data);
}
}
finally {
close(db);
}
}
public void updateObject(String table, ContentValues dataToUpdate) {
try {
db = openWrite(this.handler);
if (db != null) {
String whereClause = "...";
String[] whereArgs = {...};
db.update(table, dataToUpdate, whereClause, whereArgs);
}
}
finally {
close(db);
}
}
public void deleteObject(String table, ContentValues data) {
try {
db = openWrite(this.handler);
if (db != null) {
String whereClause = "...";
String[] whereArgs = {...};
db.delete(table, whereClause, whereArgs);
}
}
finally {
close(db);
}
}
public Object findObject(String table, ContentValues data) {
Object myObject = null;
Cursor c = null;
try {
String[] columns = {"id", "name", "lastname", ...};
String selection = "id = ?";
String[] selectionArgs = {data.getAsString("key_id")};
c = db.query(table, columns, selection, selectionArgs, null, null, null);
if (c.moveToFirst()) {
myObject = new Object();
myObject.setId(c.getInt(c.getColumnIndex("id")));
myObject.setName(c.getString(c.getColumnIndex("name")));
myObject.setLastName(c.getString(c.getColumnIndex("lastname")));
}
return myObject;
}
finally {
if (c != null) {
c.close()
}
close(db);
}
}
public List<Object> findAll(String table) {
List<Object> objects = new ArrayList<Object>();
Object myObject = null;
Cursor c = null;
try {
String[] columns = {"id", "name", "lastname", ...};
c = db.query(table, columns, null, null, null, null, null);
if (c.moveToFirst()) {
myObject = new Object();
myObject.setId(c.getInt(c.getColumnIndex("id")));
myObject.setName(c.getString(c.getColumnIndex("name")));
myObject.setLastName(c.getString(c.getColumnIndex("lastname")));
objects.add(myObject);
}
return objects;
}
finally {
if (c != null) {
c.close()
}
close(db);
}
}
private final synchronized SQLiteDatabase openWrite(SQLiteOpenHelper handler) {
if (handler != null) {
return handler.getWritableDatabase();
}
return null;
}
private final synchronized SQLiteDatabase openRead(SQLiteOpenHelper handler) {
if (handler != null) {
return handler.getReadableDatabase();
}
return null;
}
private final synchronized void close(SQLiteDatabase db) {
if (db != null && db.isOpen()) {
db.close();
}
}
}
注意:这是第一个概念,刚刚专门为您编写,因此需要更新:考虑方法的参数 --> 如何做出更好的选择,事务的使用,作为单例的数据源,对插入、更新进行一些性能测试。一切都取决于应用程序的特性。