2017-05-08 62 views
2

我在android studio上工作,我遇到了一个问题,我不能初始化我的DataHandler类中的我的sqlite实例,但我可以在我的MainActivity类中初始化它。这是在MainActivity中初始化SQLite的正确方法吗?

实施例: MainActivity类别:

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); //... 
中的DataHandler类

public class DataHandler { 
public static String[] names,dates; 

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

所以,我没有在主活动此

public SQLiteDatabase getSqLiteDatabase() { 
    return sqLiteDatabase; 
} 

在数据处理程序中:

MainActivity mainActivity; 
SQLiteDatabase sqLiteDatabase = mainActivity.getSqLiteDatabase(); 

这是正确的方法吗?有没有更好的方法? sry如果难以理解

+0

不,这不是最好的方式来做到这一点。很难说出什么问题,但第一个猜测是你不在'DataHandler'类中导入'SQLiteDatabase'。但是,为此使用'SQLiteOpenHelper'更为常见。 – Gary99

+0

我想在这里你可以获取更多信息https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper –

回答

0

最好的方法是使用Singleton模式如下描述 https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper

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使用它就像

// 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(); 

这种方法完美的适合从不同的地方访问数据库,如服务,碎片等...

3

这是正确的方法吗?

项目运行时是否引发任何错误?

这是我常在数据库处理器(只是共享)

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,声明此行

DatabaseHandler db; 

onCreate方法,初始化数据库处理器

db = new DatabaseHandler(this); 

当你想使用SQLite数据库,请确保您有这条线

SQLiteDatabase db = this.getWritableDatabase(); 
+0

感谢它的工作 –

+0

ca我使用我的方式从mainactivity获取文件 –

+0

你是什么文件意思? –

相关问题