2014-02-20 56 views
5

我在將數據插入到數據庫時出現此異常。我是android初學者任何人請幫我解決這個問題....我無法插入數據.... ..I'm發佈我的代碼和LOGCAT錯誤....創建sqlite數據庫時空指針異常

公共類Db的擴展SQLiteOpenHelper {

Context context; 
public static String databasename="modelnew.db"; 
private static final int SCHEMA_VERSION = 1; 
public static String category_table="category"; 
public static String Id="categoryid"; 
public static String Name="caregoryname"; 



public Db(Context context) { 
    //super(context,Environment.getExternalStorageDirectory()+"/"+databasename, null, 1); 
    super(context,databasename, null, SCHEMA_VERSION); 
    // TODO Auto-generated constructor stub 
    this.context=context; 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    String query="create table category_table(Id integer primary key ,Name text)"; 
    db.execSQL(query); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 

} 

}

class ProgressTask extends AsyncTask<String, String, JSONObject> 
{ 



    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 

    } 

    @Override 
    protected JSONObject doInBackground(String... args) 
    { 

     System.out.println("Inside do inbackground"+ purl); 

     Jsondbparser jParser = new Jsondbparser(); 
     // Getting JSON from URL 
     JSONObject json = jParser.getJSONFromUrl(purl); 

     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) 
    { 

     try 
     { 

      System.out.println("returnjson"+json); 
      // Getting JSON Array from URL 

      JSONObject json1 = json.getJSONObject("response"); 

      System.out.println(json1.getString("success")); 

      jsonary = json1.getJSONArray("categoryid"); 

      jsonarr=json1.getJSONArray("categoryname"); 

      for (int i = 0; i < jsonary.length(); i++) 
      { 

       categoryId = jsonary.getInt(i); 

       System.out.println("id-- "+categoryId); 

       categoryName = jsonarr.getString(i); 

       System.out.println("id-- "+categoryName); 

       idlist.add(String.valueOf(categoryId)); 

       list.add(categoryName); 

       addCategory(); 

       /*db=new Db(con); 

       Model model=new Model(); 

       model.setcid(categoryId); 

       model.setcname(categoryName); 

       addCategory(model); 

       //close();*/ 

      } 

     } 
     catch (JSONException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 

void addCategory() 
{ 

    System.out.println("inside insert method"); 

    Db h = new Db(getApplicationContext()); 

    SQLiteDatabase db = h.getWritableDatabase(); 

    for(int j=0;j<=idlist.size();j++) 
    { 

     ContentValues values = new ContentValues(); 

     values.put("categoryid", idlist.get(j));//category id 

     values.put("categoryname", list.get(j)); // Category Name 

     System.out.println("id ---"+idlist.get(j)); 

     System.out.println("name-----"+list.get(j)); 

     // Inserting Row 
     db.insert("t_category", null, values); 

     db.close(); // Closing database connection 

     System.out.println("before end"); 

    } 


} 

}

02-20 03:54:17.192: E/AndroidRuntime(931): FATAL EXCEPTION: main 
02-20 03:54:17.192: E/AndroidRuntime(931): java.lang.NullPointerException 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
02-20 03:54:17.192: E/AndroidRuntime(931): at com.example.koto.Jsondb.addCategory(Jsondb.java:133) 
02-20 03:54:17.192: E/AndroidRuntime(931): at com.example.koto.Jsondb$ProgressTask.onPostExecute(Jsondb.java:102) 
02-20 03:54:17.192: E/AndroidRuntime(931): at com.example.koto.Jsondb$ProgressTask.onPostExecute(Jsondb.java:1) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.os.AsyncTask.finish(AsyncTask.java:631) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.os.Looper.loop(Looper.java:137) 
02-20 03:54:17.192: E/AndroidRuntime(931): at android.app.ActivityThread.main(ActivityThread.java:5041) 
02-20 03:54:17.192: E/AndroidRuntime(931): at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 03:54:17.192: E/AndroidRuntime(931): at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 03:54:17.192: E/AndroidRuntime(931): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-20 03:54:17.192: E/AndroidRuntime(931): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-20 03:54:17.192: E/AndroidRuntime(931): at dalvik.system.NativeStart.main(Native Method) 
+2

你應該發佈你的代碼,我們不能找出錯誤沒有你的鱈魚 –

+0

@Mohammed momn好吧... –

+0

你可能想要確保你試圖插入的一切是有效的(即沒有空值) 。 – ErstwhileIII

回答

0

當你在下面一行用getApplicationContext()初始化你Db對象...它沒有得到任何Context ...

Db h = new Db(getApplicationContext()); 

解決您的Context問題,你可以通過你傳遞活動背景AsyncTask()構造函數。我給你一個場景......

假設,從MainActivity.java你執行你的ProgressTask.java,那麼你應該通過Context如下....

new ProgressTask(MainActivity.this).execute(); 

在你ProgressTask.java類,你可以檢索該ContextProgressTask()構造器如下....

public ProgressTask extends AsyncTask<String, String, JSONObject> { 

    Context mContext; 

    ProgressTask (Context context) { 

     mContext.this = context 

    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 

    } 

    ......... 

} 

現在,你可以按如下初始化Db對象...

Db h = new Db(mContext); 

這將解決您的問題。

+0

好吧,我會檢查它... –

+0

你可以請你發佈你的整個'AsyncTask'類...如果你ahev沒問題? –

+0

@ Hamid Shatu是的 –

0

忌用getApplicationContext()和使用YourPresentActivityClass.this代替getApplicationContext(),並確保你沒有傳遞null或使用前仔細檢查它們。

+0

感謝您的迴應我會檢查它... –

+0

是的,確信老兄,有一個偉大的一天! –

1

此時應更換此

Db h = new Db(getApplicationContext()); 

隨着

Db h = new Db(youractivity.this); 

通行證活動場景,而不是應用程序上下文。

+0

@MD感謝您的幫助,但仍然得到相同的錯誤... –

+0

@Somasundaram後我們的DB類 –

+0

@MD好吧我做... public class Db extends SQLiteOpenHelper { \t上下文上下文; \t public static String databasename =「kotonew.db」; \t private static final int SCHEMA_VERSION = 1; \t public static String category_table =「category」; \t public static String Id =「categoryid」; \t public static String Name =「caregoryname」; \t \t \t 公共DB(語境上下文){ \t \t超級(上下文中,數據庫名稱,NULL,SCHEMA_VERSION); \t \t \t \t this.context = context; \t} \t @Override \t公共無效的onCreate(SQLiteDatabase分貝){ \t \t \t \t串查詢= 「創建表category_table(ID整數主鍵,名稱文本)」; \t \t db.execSQL(query); \t} \t } –