Android 如何解决SQLiteOpenHelper.getDatabaseLocked-SQLiteOpenHelper.getReadableDatabase错误

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

我在logcat中遇到以下问题:

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
可能是许多感谢的重复!我更改了一些代码,也使用了您的帮助!也许它可以工作…再次感谢