我有一个SQLite数据库,它与扩展Activity的主类在一个单独的类中。
我注意到有两种设置数据库的方法。一种方法是将它放在主Activity类中,无论是在类中还是作为嵌套子类。第二种方法是将它放在单独的类中。
单独的班级看起来更好,但有一个缺点。每次要执行某些操作时,都必须在主活动类中创建它的实例。我读到在Android中实例化对象很昂贵,应该避免使用。
尽管如此,我宁愿将数据库作为一个单独的类。实例化对象的成本是否足以使数据库在同一个类中更好?
SQLite数据库的单独类示例:不完整的psudo-code
public class SQLiteDB {
private static class DbHelper extends SQLiteOpenHelper{
// db helper methods
}
// methods for DB, like get, set, and others
public void openDatabase(){ }
public void closeDatabse(){ }
public void insertRecord(String record){ }
}
在主Activity中使用示例:incompete psudo-code
public class Main extends Activity{
// every time I want to use it I must instantiate an object for the database class
// many instances of SQLiteDB object created, garbage collector works hard
SQLiteDB mDatabase = new SQLiteDB();
openDatabase();
insertRecord("insert this");
closeDatabase();
}
答案 0 :(得分:2)
SQLite数据库在单独的类和相同的类中,哪个更好?
这是一个非常全面的问题,它取决于更多因素(应用类型,个人要求,如何处理数据库等)。有人可能更喜欢将数据库作为内部类而将某人作为分离的类。问题是许多开发人员试图将尽可能多的代码“粘贴”到一个类中,也许他们“害怕”创建更多的类。我完全不知道。我只是作为我的个人记录提到过。
但让我们回到你的问题。什么是更好的?
我认为这种做法与separeted类。您应该只将“活动类”>
仅用于创建和处理UI。应用程序外观应与应用程序逻辑分开。如果您遵循这个“规则”,您的代码将变得更加干净和人性化(如果其他人将查看您的代码,他不应该完全丢失)。拥有20个纯粹写的课程,让所有的东西都粘在一个类(如猪)中,这不是一种耻辱。
然而,有一个缺点。你必须创建一个实例 每次你想做某事时,它都会在主要的活动课上。一世 阅读在Android中实例化对象是昂贵的,应该是 避免。
您是否考虑使用Singleton
?这种设计模式值得考虑。你将永远只有一个具有许多好处的实例e.q.不浪费记忆。我对Singleton只有很好的经验。因此,我建议您尝试使用它。
private static SQLiteOpenHelper instance;
public static SQLiteOpenHelper getInstance(Context mContext) {
if (instance == null) {
instance = new SQLiteOpenHelperImplementation(mContext);
}
return instance;
}
最后,我给你一些建议:
每次你使用游标,数据库等发布/关闭
他们在工作完成后立即工作。这可以解决许多例外情况
与SQLiteDatabase
和Cursor
同步块和方法的使用是非常好的做法 在并发编程的情况下,以避免许多问题
如果您在数据库中有多个表,我建议您创建
每个表的“服务”类将包装CRUD
操作和特定
表的方法
在销毁活动之前,请检查并释放所有未包含的来源 已经发布。
答案 1 :(得分:0)
我更喜欢你在这里提供的解决方案。主要优点是您可以从应用程序中的任何Activity(或其他类)轻松访问数据库。要解决每次使用数据库时创建新实例的问题,您可以在onCreate()
中创建单个实例,在Activity处于活动状态时使用所需的数据库,最后在{{{}}中关闭数据库1}}。
答案 2 :(得分:0)
这将是个人品味的问题。
然而,我发现有效和干净的是创建一个扩展SQLiteOpenHelper的类。在这个类中,您将最终编写SQL代码来创建表并将方法编写为存储过程。
该课程看起来像这样:
public class DatabaseInterface extends SQLiteOpenHelper {
// Database version
private static final int DATABASE_VERSION = 1;
public DatabaseInterface(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//in your oncreate you will write the queries to create your tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_NEWS = "CREATE TABLE News(id INTEGER)";
db.execSQL(CREATE_NEWS);
}
// upgrading tables
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// drop tables if exist
db.execSQL("DROP TABLE IF EXSIST " + NEWS);
// recreate tables
onCreate(db);
}
考虑一下我们有一个新闻obj,它需要1个参数作为它的构造函数,你的存储过程看起来像这样:
public ArrayList<News> getNews() {
ArrayList<News> mNewes = new ArrayList<News>();
SQLiteDatabase db = null;
Cursor cursor = null;
try {
String sQry = "SELECT * FROM " + NEWS;
db = this.getWritableDatabase();
cursor = db.rawQuery(sQry, null);
if (cursor.moveToFirst()) {
do {
mNewes.add(new News(cursor.getInt(0)));
} while (cursor.moveToNext());
}
} catch (SQLiteException e) {
Log.e("SQLite - getNewes", e.getMessage());
return null;
} finally {
cursor.close();
db.close();
}
return mNewes;
}
在上面的方法中,您获取并打开应用程序数据库,对其执行查询,预测任何sql错误,然后关闭数据库。这样做可以确保您不会打开任何您不需要/不使用的资源。
我已经在目前市场上出现的两个应用程序中使用了这种方法,它运行起来相当快,我为我的存储过程创建了几百个方法