Android:使用getWritableDatabase()获取java.lang.NullPointerException

时间:2012-08-28 15:25:06

标签: android nullpointerexception

运行getWritableDatabase或getReadableDatabase时收到空错误。我知道这个问题已经提出过很多次了,但我花了7天的时间倾注所有的评论,没有任何运气。

这是第一个代码--HandleCall

package com.mintz.callmeback;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class HandleCall extends Service implements Runnable {
String TAG = "HandleCall";
String phoneNum;

private NotificationManager notificationManager; 
private Notification notification;


//CallMeBackApp CallApp = new CallMeBackApp();
Context context;



public HandleCall(String phone)
{
    phoneNum = phone;

    Log.i(TAG, "Constractor");


}

public void run() {

    CallData callData = new CallData(this);

    //CallMeBackApp callApp = new CallMeBackApp();
    //callApp.endCall2();
    Log.i(TAG, "run1"+phoneNum);
    if (callData!=null)
        Log.d(TAG,"callData is not null!");

以下是“if”语句中的问题,我读了很多关于“null”的答案,所以我尝试检查它是否为SQL任务,如你所见:

    if ((callData != null)&&(callData.isPhoneInTheList1(phoneNum, this))){              Log.i(TAG, "run2");
        SendSms.sendIt(phoneNum);
        Log.i(TAG, "run3");

        notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        notification = new Notification(android.R.drawable.stat_notify_chat,"", 0);
        sendCallNotification(phoneNum);
    }
    else{
        Log.d(TAG, "didnt found the phone number");
    }

}

private void sendCallNotification(String phone) {
    Log.d(TAG, "sendCallNotification'ing");
    Intent callIntent = new Intent(getApplicationContext(), MakeCall.class);
    callIntent.putExtra("PhoneNumberToCallBack", phone);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, -1,callIntent ,PendingIntent.FLAG_UPDATE_CURRENT); //
    this.notification.when = System.currentTimeMillis(); // time when it's happened
    this.notification.flags |= Notification.FLAG_AUTO_CANCEL; // This flag tells the Notification manager to cancel this notification as soon as the user clicks on it.
    CharSequence notificationTitle = this.getText(R.string.callBackToTitle); //
    CharSequence notificationSummary = this.getString(R.string.callBackToMessage, phone);
    this.notification.setLatestEventInfo(this, notificationTitle, notificationSummary, pendingIntent); //
    this.notificationManager.notify(0, this.notification);
    Log.d(TAG, "sendTimelineNotificationed");
    }

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}


}

和另一个班级:

package com.mintz.callmeback;

import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class CallData {


static final String TAG = "CallData";
static final String DB_NAME = "PhoneToCallBack.db"; // database filename
static final int DB_VERSION = 1;
static final String TABLE = "PhoneToCallBack";
static final String C_ID = "_id";
static final String C_PHONE_NUMBER = "phone_number";
private static final String GET_ALL_ORDER_BY = C_PHONE_NUMBER + " DESC";
private static final String[] DB_PHONE_COLUMNS = { C_PHONE_NUMBER };
Context context;

// Constructor
public CallData(Context context) {
    Log.i(TAG, "Initialized data");
    this.context = context;
    this.dbHelper = new DBHelper(context);
}

// DataBase Helper for the all App
public class DBHelper extends SQLiteOpenHelper {
    Context context;


    // Constructor
      public DBHelper(Context context) {
          super(context, DB_NAME, null, DB_VERSION);
          this.context = context;
      }  
    // Not nead for now
    //public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
    //  super(context, name, factory, DB_VERSION);
    //  this.context = context;
    //}

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "Creating database: " + DB_NAME);
        //String sql = context.getString(R.string.sql1);
        //Log.d(TAG, "onCreated sql: " + sql);
        db.execSQL("create table " + TABLE + " (" + C_ID + " int primary key, "
                  + C_PHONE_NUMBER + " text)");
        //db.execSQL(sql);
    }


    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE); // blow the old database away
        Log.d(TAG, "onUpdated");
        this.onCreate(db); // run onCreate to get new database
      }
}//End of DBHelper Class



public DBHelper dbHelper;

public void close() {
    this.dbHelper.close();
}


public void insertOrIgnore(ContentValues values) {
    Log.d(TAG, "insertOrIgnore on " + values);
    SQLiteDatabase db = this.dbHelper.getWritableDatabase();
    try {
        db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE); 
    } finally {
        db.close();
    }
}

  /**
   * 
   * @return Cursor where the columns are _id, phone_number
   */
  public Cursor getPhoneList() {
    SQLiteDatabase db = this.dbHelper.getReadableDatabase();
    return db.query(TABLE, null, null, null, null, null, GET_ALL_ORDER_BY);
  } 

  /**
   * Deletes ALL the data
   */
  public void delete() {
    // Open Database
    SQLiteDatabase db = this.dbHelper.getWritableDatabase();

    // Delete the data
    db.delete(TABLE, null, null);

    // Close Database
    db.close();
  }

  /**
   * 
   * @param Phone number to check if exist
   * @return True if the number is in the list
   */
  public Boolean isPhoneInTheList(String phone) {
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Log.d(TAG, "befor query");
    //Cursor cursor = db.query(TABLE, null, null, phone, null, null, null);

    Cursor cursor = db.query("PhoneToCallBack", null, "phone_number=" + phone,null, null, null, null);


      return (cursor.moveToFirst()) ; //Return True if find the Phone number in the DB


  }

  public Boolean isPhoneInTheList1(String phone, Context context) {
        //DBHelper dbHelper1;
        dbHelper = new DBHelper(context);
        SQLiteDatabase database;

        if (dbHelper != null)
            Log.d(TAG,"dbHelper1 != null");

        database = dbHelper.getWritableDatabase();
        Log.d(TAG, "befor query");
        Cursor cursor = database.query("PhoneToCallBack", null, "phone_number=" + phone,null, null, null, null);
        return (cursor.moveToFirst()) ; //Return True if find the Phone number in the DB


      }

}

这是我拨打电话并致电HandleCall时所得到的:

08-28 15:17:45.706: I/CallData(340): Initialized data
08-28 15:17:45.725: I/CallData(340): Initialized data
08-28 15:17:45.725: D/CallMeBackMainActivity(340): onCreate
08-28 15:17:45.826: D/CallMeBackMainActivity(340): onResume
08-28 15:17:45.826: D/CallMeBackMainActivity(340): Get the data from the database
08-28 15:17:45.886: D/CallMeBackMainActivity(340): Get the Cursor
08-28 15:19:21.495: D/PhoneServiceReceiver(340): the number is: 55555555
08-28 15:19:21.505: D/MyPhoneStateListener(340): RINGING from 55555555
08-28 15:19:21.535: I/HandleCall(340): Constractor
08-28 15:19:21.588: I/CallData(340): Initialized data
08-28 15:19:21.588: I/HandleCall(340): run155555555
08-28 15:19:21.595: D/HandleCall(340): callData is not null!
08-28 15:19:21.605: D/CallData(340): dbHelper1 != null
08-28 15:19:21.605: W/dalvikvm(340): threadid=9: thread exiting with uncaught exception (group=0x40015560)
08-28 15:19:21.638: E/AndroidRuntime(340): FATAL EXCEPTION: Thread-10
08-28 15:19:21.638: E/AndroidRuntime(340): java.lang.NullPointerException
08-28 15:19:21.638: E/AndroidRuntime(340):  at                android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-28 15:19:21.638: E/AndroidRuntime(340):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
08-28 15:19:21.638: E/AndroidRuntime(340):  at com.mintz.callmeback.CallData.isPhoneInTheList1(CallData.java:133)
08-28 15:19:21.638: E/AndroidRuntime(340):  at com.mintz.callmeback.HandleCall.run(HandleCall.java:43)
08-28 15:19:21.638: E/AndroidRuntime(340):  at java.lang.Thread.run(Thread.java:1019)
08-28 15:19:21.895: W/IInputConnectionWrapper(340): showStatusIcon on inactive     InputConnection
08-28 15:19:40.655: D/dalvikvm(340): GC_EXPLICIT freed 92K, 52% free 2599K/5379K, external 884K/1038K, paused 115ms

我很乐意得到任何帮助,我真的被卡住了!

1 个答案:

答案 0 :(得分:0)

我认为您正在使用来自Activity的新调用初始化HandleCall。如果是这样,你就不能这样做。因为在这种情况下,您将没有HandleCall服务的上下文。这就是你崩溃的原因。

如果您正在执行new HandleCall,则无法通过

中的this
CallData callData = new CallData(this);

您必须传递一个由框架初始化的正确context而不是上面的行

编辑:

public HandleCall(String phone, Context ctx)
{
    phoneNum = phone;
    context = ctx;
    Log.i(TAG, "Constractor");


}

现在使用

 CallData callData = new CallData(context);

同时致电new HandleCall(phone, Activityname.this)