【已解决】 求教大佬SQLite getReadableDatabase()报错
在使用SQLite查询数据时,报错。
报错信息如下:

我使用的没那么复杂,大概的流程是这样的 -> 1.在Activity中调用Helper实现类来创建数据库;2.在Activity中 向数据库中存入数据;
3.在点击控件时,调用对应方法来查询数据,最终实在manager中进行查询操作。
主要代码如下:
DatabaseHelper :
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DBNAME = "MusicData.db";
/**
* 创建一个音乐表,包含id position 以及filepath
* 本意是在遍历音乐列表数据的时候 将position 和filepath一 一对应起来
*/
public static final String CREATE_MUSIC = "create table Music(" +
"id integer primary key autoincrement," +
"position integer," +
"filepath text)";
public DatabaseHelper(@Nullable @org.jetbrains.annotations.Nullable Context context, @Nullable @org.jetbrains.annotations.Nullable String name, @Nullable @org.jetbrains.annotations.Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 参数为上下文的构造方法 便于传递上下文
* @param context
*/
public DatabaseHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_MUSIC);//创建数据库
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity中正常存入没有问题 就不多粘贴了,粘贴一下创建数据库的代码
mDatabaseHelper = new DatabaseHelper(getApplicationContext());
在Manager中使用的地方
public class MusicPlayManager implements IMusicPlayManager {
private static final String TAG = MusicPlayManager.class.getSimpleName();
private MusicInfo musicInfo;
private MusicPlayListener MIMusicPlayListener;
private Context mContext;
MediaPlayer mediaPlayer = new MediaPlayer();
private int nowPosition;//点击下一首 上一首前的音乐的位置
private DatabaseHelper mDatabaseHelper;
/**
省略其他代码,只贴出了Manager前面声明的对象 以及 真正调用数据库进行查询的方法
**/
private String queryMusicFile() {
SQLiteDatabase db = mDatabaseHelper.getReadableDatabase(); //这里报错了,无论是getRead还是getWrite都是报错 空指针
String path = null;
String[] selection = {String.valueOf(nowPosition - 1)};
Cursor cursor = db.query("Music", null, null, selection, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
path = cursor.getString(cursor.getColumnIndex("filepath"));
}
return path;
}
}
在Manager中进行查询时 发生的报错,看了一些论坛的帖子 大部分都是说 Context的问题,但是我还是不太理解,因为好多帖子都是Fragment中的使用,感觉和我不太一样。
看看哪位大佬能指点一二,感激不尽。
啊哈哈哈哈,我自己改好了,原因确实是因为context没有传递正确。
由于我这个不是在fragment中使用,而是在MVP下从V -> P -> M
故此,在V层点击控件时,我传入上下文即可
在M层使用时,helper = new OnpenHelper(mContext); mContext为V层传递过来的上下文
然后在正常进行读写即可。
SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();