【问题标题】:Null pointer exception while creating sqlite database创建 sqlite 数据库时出现空指针异常
【发布时间】:2014-02-20 03:58:57
【问题描述】:

我在将数据插入数据库时​​遇到了这个异常。我是 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)

【问题讨论】:

  • 你应该发布你的代码,没有你的代码我们无法找出错误
  • 您可能希望确保您尝试插入的所有内容都是有效的(即没有空值)。
  • @mohammedmomn 我已经在 Db 类中创建了数据库,并尝试从上述方法中插入另一个类中的数据,但错误重复我不知道我犯了什么错误....
  • @Somasundaram 检查虚拟值是否插入到您的数据库中,然后您从服务中传递数据
  • @ErstwhileIII 我在插入之前检查了值,但它显示错误.... 02-20 03:54:17.131: I/System.out(931): id-- 1 02-20 03:54:17.131: I/System.out(931): id-- Fruits 02-20 03:54:17.131: I/System.out(931): 内部插入方法 02-20 03:54:17.131: D /AndroidRuntime(931): 关闭 VM 02-20 03:54:17.131: W/dalvikvm(931): threadid=1: 线程退出未捕获异常 (group=0x40a71930) java.lang.NullPointerException

标签: android nullpointerexception android-sqlite sql-insert


【解决方案1】:

你应该替换这个

 Db h = new Db(getApplicationContext());

 Db h = new Db(youractivity.this);

传递活动上下文而不是应用程序上下文。

【讨论】:

  • @Somasundaram 发布你的 DB 类
  • @M D 好的,我愿意...公共类 Db 扩展 SQLiteOpenHelper{ 上下文上下文;公共静态字符串数据库名称=“kotonew.db”;私有静态最终 int SCHEMA_VERSION = 1;公共静态字符串 category_table="category";公共静态字符串 ID="categoryid";公共静态字符串名称=“护理名称”;公共数据库(上下文上下文){超级(上下文,数据库名称,空,SCHEMA_VERSION); this.context=上下文; } @Override public void onCreate(SQLiteDatabase db) { String query="create table category_table(Id integer primary key ,Name text)"; db.execSQL(查询); } }
  • @Somasundaram 将其发布到您的问题中
  • @Somasundaram 还将db.execSQL("DROP TABLE IF EXISTS category_table"); onCreate(db); 添加到onUpgrade() 中的Db
【解决方案2】:

当您在以下行中使用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);

这将解决您的问题。

【讨论】:

  • 能否请您发布您的整个AsyncTask 课程...如果您没问题吗?
【解决方案3】:

避免使用getApplicationContext() 并使用YourPresentActivityClass.this 而不是getApplicationContext() 并确保您没有传递 null 或在使用前仔细检查它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多