Android 如何解决SQLiteOpenHelper.getDatabaseLocked-SQLiteOpenHelper.getReadableDatabase错误
我在logcat中遇到以下问题:Android 如何解决SQLiteOpenHelper.getDatabaseLocked-SQLiteOpenHelper.getReadableDatabase错误,android,sqlite,Android,Sqlite,我在logcat中遇到以下问题: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224); at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188); at package.SQLiteAda
java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224);
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188);
at package.SQLiteAdapter.openToRead(SQLiteAdapter.java:52);
at package.SMSStateReceiver.cercaNumeroSQLite(SMSStateReceiver.java:99);
我知道调试器的问题来自构造函数的上下文null!我研究这个问题已经3天了,虽然我做了各种尝试,但我没有太多的Android经验,我找不到合适的制造商来解决这个问题
我有一个SQLite适配器,它在content1中包含字符串name,在content2中包含字符串phone_number,可以找到
public class SQLiteAdapter {
public static final String MYDATABASE_NAME = "MY_DATABASE";
public static final String MYDATABASE_TABLE = "MY_TABLE";
public static final int MYDATABASE_VERSION = 1;
public static final String KEY_ID = "_id";
public static final String KEY_CONTENT1 = "Content1";
public static final String KEY_CONTENT2 = "Content2";
private String[] STUDENT_TABLE_COLUMNS = { KEY_ID, KEY_CONTENT1, KEY_CONTENT2 };
//create table MY_DATABASE (ID integer primary key, Content text not null);
private static final String SCRIPT_CREATE_DATABASE =
"create table " + MYDATABASE_TABLE + " ("
+ KEY_ID + " integer primary key autoincrement, "
+ KEY_CONTENT1 + " text not null, "
+ KEY_CONTENT2 + " text not null);";
private SQLiteHelper sqLiteHelper;
private SQLiteDatabase sqLiteDatabase;
private Context context;
private SMSStateReceiver sms;
public SQLiteAdapter(Context c){
context = c;
}
public SQLiteAdapter(SMSStateReceiver smsStateReceiver) {
// TODO Auto-generated constructor stub
}
public SQLiteAdapter openToRead() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getReadableDatabase();
return this;
}
public SQLiteAdapter openToWrite() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
return this;
}
public void close(){
sqLiteHelper.close();
}
public long insert(String content1, String content2){
ContentValues contentValues = new ContentValues();
contentValues.put(KEY_CONTENT1, content1);
contentValues.put(KEY_CONTENT2, content2);
return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);
}
public int deleteAll(){
return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
}
public void delete_byID(int id){
sqLiteDatabase.delete(MYDATABASE_TABLE, KEY_ID+"="+id, null);
}
public void update_byID(int id, String v1, String v2){
ContentValues values = new ContentValues();
values.put(KEY_CONTENT1, v1);
values.put(KEY_CONTENT2, v2);
sqLiteDatabase.update(MYDATABASE_TABLE, values, KEY_ID+"="+id, null);
}
public Cursor queueAll(){
String[] columns = new String[]{KEY_ID, KEY_CONTENT1, KEY_CONTENT2};
Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,
null, null, null, null, null);
return cursor;
}
public List getAllNumeri() {
List students = new ArrayList();
Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, STUDENT_TABLE_COLUMNS, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Persona student = parseStudent(cursor);
students.add(student);
cursor.moveToNext();
}
cursor.close();
return students;
}
private Persona parseStudent(Cursor cursor) {
Persona student = new Persona();
student.setName(cursor.getString(2));
return student;
}
public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(SCRIPT_CREATE_DATABASE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public List getAllStudents() {
List students = new ArrayList();
Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, STUDENT_TABLE_COLUMNS, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Persona student = parseStudent(cursor);
students.add(student);
cursor.moveToNext();
}
cursor.close();
return students;
}
private Persona parseStudent(Cursor cursor) {
Persona student = new Persona();
student.setId((cursor.getInt(0)));
student.setName(cursor.getString(1));
return student;
}
}
}
我还有一个sms接收器,我正在尝试将传入的sms号码与sqlite中的号码列表进行比较:
public class SMSStateReceiver extends BroadcastReceiver
{
private SQLiteAdapter mySQLiteAdapter;
Cursor c;
CallFilterService cfs;
public void onReceive(Context context, Intent intent)
{
String MSG_TYPE=intent.getAction();
if(MSG_TYPE.equals("android.provider.Telephony.SMS_RECEIVED"))
{
Toast toast;
Toast toast = Toast.makeText(context,"SMS Received: "+MSG_TYPE , Toast.LENGTH_LONG);
toast.show();
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++)
{
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
final SharedPreferences mpref=context.getSharedPreferences("BLOCK",context.MODE_PRIVATE);
String str=mpref.getString("phonesms","Phone");
Log.e("phone no==",""+smsMessage[0].getOriginatingAddress());
boolean value = cercaNumeroSQLite(smsMessage[0].getOriginatingAddress().toString());
if(str.contains("Phone") && (value == true))
{
toast = Toast.makeText(context,"BLOCKED Received SMS from: " +smsMessage[0].getOriginatingAddress(), 5000);
toast.show();
abortBroadcast();
}
}
else if(MSG_TYPE.equals("android.provider.Telephony.SEND_SMS"))
{
}
else
{
Toast toast = Toast.makeText(context,"SIN ELSE: "+MSG_TYPE , Toast.LENGTH_LONG);
toast.show();
abortBroadcast();
for(int i=0;i<8;i++)
{
System.out.println("Blocking SMS **********************");
}
}
}
public boolean cercaNumeroSQLite(String phone) {
mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToRead();
System.out.println("num tel - " + phone);
List numeri = mySQLiteAdapter.getAllNumeri();
String num = numeri.toString();
boolean trovato = false;
if(numeri.size() >= 1) {
List<String> numeriTel = new ArrayList<String>();
numeriTel = mySQLiteAdapter.getAllNumeri();
for (int i = 0; i < numeri.size(); i++) {
Persona numero = (Persona) numeri.get(i);
if(PhoneNumberUtils.compare(numero.toString(), phone)){
trovato = true;
mySQLiteAdapter.close();
} else {
}
}
} else {
mySQLiteAdapter.close();
}
return trovato;
}
}
公共类SMSStateReceiver扩展了BroadcastReceiver
{
私有SQLiteAdapter mySQLiteAdapter;
光标c;
呼叫过滤服务cfs;
公共void onReceive(上下文、意图)
{
字符串MSG_TYPE=intent.getAction();
if(MSG_TYPE.equals(“android.provider.Telephony.SMS_RECEIVED”))
{
吐司;
Toast Toast=Toast.makeText(上下文,“收到短信:+MSG\u TYPE,Toast.LENGTH\u LONG);
toast.show();
Bundle=intent.getExtras();
对象消息[]=(对象[])bundle.get(“PDU”);
SmsMessage SmsMessage[]=新SmsMessage[messages.length];
对于(int n=0;n
有人能帮我吗???谢谢你的帮助检查你传递给SQLiteAdapter的constructor的上下文是否与你在BroadcastReceiver中的onReceive方法上接收到的相同。你在
SQLiteAdapter
中的上下文
变量没有初始化。你有两个构造函数,其中只有一个初始化变量。您实际使用的变量不会初始化它
将null
上下文
传递给SQLiteOpenHelper
构造函数会在使用例如getWritableDatabase()
访问数据库时导致此异常
要修复此问题,请删除此构造函数:
public SQLiteAdapter(SMSStateReceiver smsStateReceiver) {
// TODO Auto-generated constructor stub
}
改变
mySQLiteAdapter = new SQLiteAdapter(this);
差不多
mySQLiteAdapter = new SQLiteAdapter(context);
其中
context
是传递给您的onReceive()
的context
可能是许多感谢的重复!我更改了一些代码,也使用了您的帮助!也许它可以工作…再次感谢