我正在从“Kotlin in Action”中学习 Kotlin,我正在慢慢地将 Android 应用程序代码转换为它。但是我在转换以下类时发现了一些问题。
public class DatabaseController {
private static DatabaseController sDatabaseController;
private SQLiteDatabase mDatabase;
private DatabaseController(Context context) {
mDatabase = new SQLiteOpenHelperImpl(context.getApplicationContext())
.getWritableDatabase();
}
public static DatabaseController getDatabaseController(Context context) {
if (sDatabaseController == null) {
sDatabaseController = new DatabaseController(context);
}
return sDatabaseController;
}
public void addElement(Element element) {
if (element != null) {
ContentValues values = getContentValues(element);
mDatabase.beginTransaction();
try {
// insert element
mDatabase.setTransactionSuccessful();
} finally {
mDatabase.endTransaction();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我提出了两种不同的 Kotlin 实现,但它们都不能完全说服我。哪一个可以被认为是更好的解决方案?或者是否存在第三个更好的?
使用对象的第一个实现
object DatabaseControllerObject {
private var mDatabase : SQLiteDatabase? = null
fun initDatabase(context: Context) {
mDatabase = mDatabase?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase
}
fun addElement(context: Context, element: Element) {
initDatabase(context)
// insert alarm
mDatabase?.let {
// CODE
}
}
Run Code Online (Sandbox Code Playgroud)
第二个实现,所有内容都在一个文件中,我在需要数据库的每个活动的 onCreate() 中调用 initDatabase(..)
private var mDatabase: SQLiteDatabase? = null
fun initDatabase(context: Context) {
mDatabase = mDatabase ?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase
}
fun addElement(element: Element) {
val values = getContentValues(element)
mDatabase?.let {
it.beginTransaction()
try {
// insert
it.setTransactionSuccessful()
} finally {
it.endTransaction()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为你想要的是一个伴生对象:
class DatabaseController
{
private constructor(context: Context)
{
// ...
}
companion object
{
private var instance: DatabaseController? = null
fun getInstance(context: Context): DatabaseController
{
if(instance == null)
{
instance = DatabaseController(context)
}
return instance!!
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样称呼它:
val databaseController = DatabaseController.getInstance(context)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2044 次 |
最近记录: |