首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >它是在SQLite中初始化MainActivity的正确方法吗?

它是在SQLite中初始化MainActivity的正确方法吗?
EN

Stack Overflow用户
提问于 2017-05-08 02:18:56
回答 2查看 1.2K关注 0票数 2

我在android上工作,遇到了一个问题,我不能在我的DataHandler类中初始化sqlite实例,但是我可以在我的MainActivity类中初始化它。

示例: MainActivity类:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

//valid
private SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("Database", Context.MODE_PRIVATE , null); //...

在数据处理程序类中:

代码语言:javascript
复制
public class DataHandler {
public static String[] names,dates;

//invalid: cannot resolve method
SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("HMDB", Context.MODE_PRIVATE , null);

所以,我做了这个

主要活动:

代码语言:javascript
复制
public SQLiteDatabase getSqLiteDatabase() {
    return sqLiteDatabase;
}

在数据处理程序中:

代码语言:javascript
复制
MainActivity mainActivity;
SQLiteDatabase sqLiteDatabase = mainActivity.getSqLiteDatabase();

这样做对吗?有什么更好的方法吗?如果很难理解sry

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-03 05:12:27

最好的方法是使用Singleton模式,如本文所述,guides/wiki/Local-Databases-with-SQLiteOpenHelper

代码语言:javascript
复制
public class PostsDatabaseHelper extends SQLiteOpenHelper { 
  private static PostsDatabaseHelper sInstance;

  // ...

  public static synchronized PostsDatabaseHelper getInstance(Context context) {
    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context.
    if (sInstance == null) {
      sInstance = new PostsDatabaseHelper(context.getApplicationContext());
    }
    return sInstance;
  }

  /**
   * Constructor should be private to prevent direct instantiation.
   * Make a call to the static method "getInstance()" instead.
   */
  private PostsDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }
}

在您的MainActivity中使用它就像

代码语言:javascript
复制
// In any activity just pass the context and use the singleton method
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(this);
// or
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(context);
// or
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(getActivity());
// Do something with data via Cursor and
helper.close();

这种方法非常适合于从您的应用程序的不同位置访问数据库,如服务、片段等。

票数 0
EN

Stack Overflow用户

发布于 2017-05-08 02:46:18

这样做对吗?

当项目运行时,它会抛出错误吗?

这就是我通常在DatabaseHandler中所做的(只是分享)

代码语言:javascript
复制
public class DatabaseHandler extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "DATA.db";
    public static final String TABLE_NAME = "TITLE";
    public static final String COL0 = "ID";
    public static final String COL1 = "TODO";
    public static final String COL2 = "DETAIL";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, TODO TEXT, DETAIL TEXT)";
        db.execSQL(createTable);    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop if database is exists" + TABLE_NAME);
        onCreate(db);
    }
}

MainActivity中,声明以下一行

代码语言:javascript
复制
DatabaseHandler db;

DatabaseHandler方法中,初始化onCreate

代码语言:javascript
复制
db = new DatabaseHandler(this);

当您想使用SQLite数据库时,请确保您有以下行

代码语言:javascript
复制
SQLiteDatabase db = this.getWritableDatabase();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43838827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档