[英]Null pointer exception while creating sqlite database
我在將數據插入Database時遇到此異常。我是android初學者,請幫我解決這個問題....我無法插入數據......我發布了我的代碼和LOGCAT
錯誤....
公共類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)
你應該替換它
Db h = new Db(getApplicationContext());
同
Db h = new Db(youractivity.this);
傳遞活動上下文而不是應用上下文。
避免使用getApplicationContext()
並使用YourPresentActivityClass.this
而不是getApplicationContext()
,並確保在使用之前沒有傳遞null或仔細檢查它們。
當您使用以下行中的getApplicationContext()
初始化Db
對象時...它沒有獲得任何Context
...
Db h = new Db(getApplicationContext());
要解決Context
問題,可以通過AsyncTask()
構造函數傳遞活動的上下文。 我給你一個場景......
假設您從MainActivity.java
執行ProgressTask.java
那么您應該按如下方式傳遞Context
....
new ProgressTask(MainActivity.this).execute();
在ProgressTask.java
類中,您可以從ProgressTask()
構造函數中檢索該Context
,如下所示....
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);
這將解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.