我的Android应用程序需要一个本地数据库。哪种方式最好?我使用哪个类子类,子类,重新实现等。我在网上发现了太多信息,但我仍然不知道哪种是最佳做法。
答案 0 :(得分:6)
这是一个非常广泛的问题,取决于您的经验和使用水平。
但通常的做法是创建自己的ContentProvider
,它将抽象对数据库的访问。这样您就可以使用Uri
来执行select / update / delete / insert查询。
对于SQLite数据库本身,使用SQLiteOpenHelper
来抽象SQLite数据库的创建和升级。这将允许您升级数据库,而无需用户轻松丢失所有数据。
我可以在我的一个旧项目中附加一段代码,这些代码可以帮助您入门。但实施整个事情可能超出单个问题/答案的范围。
public class MyServiceProvider extends ContentProvider {
private SQLiteDatabase db;
@Override
public boolean onCreate() {
// Initialize the database and assign it to the private variable
MyDatabaseHelper sqlHelper = new MyDatabaseHelper(getContext());
db = sqlHelper.getReadableDatabase();
return (db == null)?false:true;
}
@override
Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// handle the query here, form it, do your checks and then access the DB
db.query(....);
}
}
class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = "MyAppTag";
private static final String DB_NAME = "Databasename";
private static final String TABLE_NAME = "Tablename";
private static final int DATABASE_VERSION = 2;
public static MyServiceProvider.CONTENT_URI = Uri.parse("content://com.mycompany.myApp.MyAppService/myTableOrIdentifier");
public MyDatabaseHelper(Context context){
super(context, DB_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS ....";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Here you can perform updates when the database structure changes
// Begin transaction
db.beginTransaction();
try {
if(oldVersion<2){
// Upgrade database structure from Version 1 to 2
String alterTable = "ALTER ....";
db.execSQL(alterTable);
Log.i(LOG_TAG,"Successfully upgraded to Version 2");
}
// This allows you to upgrade from any version to the next most
// recent one in multiple steps as you don't know if the user has
// skipped any of the previous updates
if(oldVersion<3){
// Upgrade database structure from Version 2 to 3
String alterTable = "ALTER ....";
db.execSQL(alterTable);
Log.i(LOG_TAG,"Successfully upgraded to Version 3");
}
// Only when this code is executed, the changes will be applied
// to the database
db.setTransactionSuccessful();
} catch(Exception ex){
ex.printStackTrace();
} finally {
// Ends transaction
// If there was an error, the database won't be altered
db.endTransaction();
}
}
}
然后您可以使用游标与数据库进行交互。
ContentResolver contentResolver = getContentResolver();
...
Cursor c = contentResolver.query(
// The Uri results in content://com.mycompany.myApp.MyAppService/myTableOrIdentifier/someId
Uri.withAppendedPath(MyServiceProvider.CONTENT_URI, someId),
new String[] {
// only get fields we need!
"MyDbFieldIneed"
},
null, null, null);
这将返回Cursor
,您可以迭代并获得结果。这也是Android中大多数事情的实现方式(即通过Uri和Cursor从地址簿中获取地址也是如此)。
修改强> 我意识到链接很难看到代码亮点。这里是您需要的重要课程的链接。
编辑2:
此外,如果您使用多个表格,UriMatcher
也是一个重要的来源
答案 1 :(得分:4)
我想使用SQLite数据库的最佳方法是使用ContentProviders。搜索它时,您会发现ContentProvider API非常复杂。但是有一个非常好的库使这个过程非常简单。它被称为ProviGen,您可以在下面的链接中找到有关它的详细信息。
https://github.com/TimotheeJeannin/ProviGen
它非常易于使用。您将只创建一个Contract类,您将使用注释指示数据库中需要的列,它将自动创建所有列。我甚至可以在一个数据库中创建多个表。
答案 2 :(得分:2)
我想说最好的做法是使用一个框架,它将为您完成大部分工作。在使用数据库时,我个人更喜欢ORM映射,所以我建议尝试一些ORM框架。我所知道的最好的是OrmLite。作者也在这里回答关于SO的问题,这可能非常有用。
但如果你不想使用它,你应该从阅读这些文章开始:
答案 3 :(得分:1)
答案 4 :(得分:1)
<强> Which is the best manner for this?
强>
您需要使用Android附带的SQLite
。每个Android应用都可以拥有自己的数据库。
<强> which class sub I use, subclass, reimplement,
强>
您需要扩展SQLiteOpenHelper
类,它确定数据库的名称,升级/降级方式,表格的结构等等。它还定义了获取数据库引用的方法。
是的,那里有很多资源,不是大脑友好和优质资源。以下是我喜欢的一些:
SQLite and COntentProvider by Lars Vogel
Prof. Gustin's Android Tutorials
至于问题的标题 Best practices for Android databases
,我只能说所有适用于SQL数据库的最佳做法都适用于规范化等