【问题标题】:Error in changing database to getWritableDatabase() method将数据库更改为 getWritableDatabase() 方法时出错
【发布时间】:2014-11-15 11:15:18
【问题描述】:

我有使用数据库的源代码。
我的数据库代码在一个类中,当我从这个类中插入任何东西时没有问题。 但是,如果在其他类中调用该方法,则会从这一行显示错误消息“java.lang.nullpointerexception”SQLiteDatabase sd = getWritableDatabase();

这是我的主要课程:

public static class SchemaHelper extends SQLiteOpenHelper {
         private static final String DATABASE_NAME = "adv_data.db";
         // TOGGLE THIS NUMBER FOR UPDATING TABLES AND DATABASE
         private static final int DATABASE_VERSION = 1;
         SchemaHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
         }

         @Override
         public void onCreate(SQLiteDatabase db) {

            // CREATE JOINT TABLE
             db.execSQL("CREATE TABLE"+ JointTable.TABLE_NAME  
            + "("+ JointTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"         
            + JointTable.NAME +" TEXT, "
            + JointTable.FAMILY + " TEXT,"
            + JointTable.ADDRESS+"TEXT,"
            + JointTable.PARTICIPATIONNUM +"Text,"
            + JointTable.RECOGNITIONNUM + "TEXT,"
            + JointTable.USAGE +"TEXT );");


         }
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion,
             int newVersion) {
             Log.w("LOG_TAG", "Upgrading database from version "
             + oldVersion + " to " + newVersion + ", which will destroy all old data");
             // KILL PREVIOUS TABLES IF UPGRADED
             db.execSQL("DROP TABLE IF EXISTS "+ JointTable.TABLE_NAME);

             // CREATE NEW INSTANCE OF SCHEMA
             onCreate(db);
                        } // End of onUpdate class

================================ 插入表 ============= =======================

         public  long addJoit(String name, String family, String address,
                 String participationNum ,String recognitionNum, String usage ){

             ContentValues cv= new ContentValues();
             cv.put(JointTable.NAME, name);
             cv.put(JointTable.FAMILY, family);
             cv.put(JointTable.ADDRESS, address);
             cv.put(JointTable.PARTICIPATIONNUM, participationNum);
             cv.put(JointTable.RECOGNITIONNUM,recognitionNum);
             cv.put(JointTable.USAGE, usage);

             SQLiteDatabase sd = this.getWritableDatabase();// this line get the error
             long result= sd.insert(JointTable.TABLE_NAME,
                     JointTable.NAME, cv);
             return result;
         }





             }
}

这是调用该方法的另一个类

MainActivity.SchemaHelper sh = new MainActivity.SchemaHelper(null);

long result=  sh.addJoit("name", "family", "address", "participationNum", "recognitionNum", "usage");

我想知道原因 谢谢

【问题讨论】:

  • 你错过了一个空格:db.execSQL("CREATE TABLE"+ JointTable.TABLE_NAME 应该是db.execSQL("CREATE TABLE "+ JointTable.TABLE_NAME 否则根本不会创建表。

标签: android eclipse sqlite nullpointerexception getwritabledatabase


【解决方案1】:

通过这种方式调用方法,我的问题已经解决了:

MainActivity.SchemaHelper sh = new MainActivity.SchemaHelper(getBaseContext());

构造函数需要getBaseContext()方法。

感谢大家帮助我。

【讨论】:

    【解决方案2】:

    看来sh是null是因为你在SchemaHelper构造函数中传入了null,所以改一下

    MainActivity.SchemaHelper sh = new MainActivity.SchemaHelper(null);
    

    SchemaHelper sh = new SchemaHelper(MainActivity.this);
    

    并在您的创建表语句中添加空间,即改变

      db.execSQL("CREATE TABLE"+ JointTable.TABLE_NAME  
                + "("+ JointTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"         
                + JointTable.NAME +" TEXT, "
                + JointTable.FAMILY + " TEXT,"
                + JointTable.ADDRESS+"TEXT,"
                + JointTable.PARTICIPATIONNUM +"Text,"
                + JointTable.RECOGNITIONNUM + "TEXT,"
                + JointTable.USAGE +"TEXT );");
    

      db.execSQL("CREATE TABLE "+ JointTable.TABLE_NAME  
                + "("+ JointTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"         
                + JointTable.NAME + " TEXT, "
                + JointTable.FAMILY + " TEXT,"
                + JointTable.ADDRESS + " TEXT,"
                + JointTable.PARTICIPATIONNUM +" TEXT,"
                + JointTable.RECOGNITIONNUM + " TEXT,"
                + JointTable.USAGE + " TEXT);");
    

    并正确设置context,即改变

     SchemaHelper(Context context) {
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
             }
    

     Context mContext;
     SchemaHelper(Context context) {
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
             mContext = context;
             }
    

    改变

     SQLiteDatabase sd = this.getWritableDatabase();
    

     SQLiteDatabase sd = mContext.getWritableDatabase();
    

    【讨论】:

    • 我改了,还是有问题。它可以工作,但是当它从其他类调用时,将显示消息
    • 我这样做了,但它是一样的。
    • @Khodayar 查看已编辑的答案。并且还尝试清除项目并在更改后删除现有应用程序。
    • 试试这样,SQLiteDatabase db = this.getWritableDatabase(); ContentValues 值 = new ContentValues();
    【解决方案3】:

    为简单起见制作不同的类。

     public class Insert {
    
        private Context context;
        private SchemaHelper schemaHelper;
        private SQLiteDatabase database;
    
    
        public Insert(Context context) {
            this.context = context;
        }
    
    
        public  long addJoit(String name, String family, String address,
                             String participationNum ,String recognitionNum, String usage ){
    
            schemaHelper=new SchemaHelper(context);
            database=schemaHelper.getWritableDatabase();
    
            ContentValues cv= new ContentValues();
            cv.put(JointTable.NAME, name);
            cv.put(JointTable.FAMILY, family);
            cv.put(JointTable.ADDRESS, address);
            cv.put(JointTable.PARTICIPATIONNUM, participationNum);
            cv.put(JointTable.RECOGNITIONNUM,recognitionNum);
            cv.put(JointTable.USAGE, usage);
    
    
            long result= database.insert(JointTable.TABLE_NAME,
                    null, cv);
            database.close();
            return result;
        }
    
    }
    

    在 MainActivity 类中,

    Insert insert=new Insert(MainActivity.this);
    
    
      long add=insert.addJoit("name", "family", "address", "participationNum", "recognitionNum",        "usage");
    

    另外,如果没有创建表,在sql语句中添加空格。即

    db.execSQL(" CREATE TABLE "+ JointTable.TABLE_NAME  
            + " ( "+ JointTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "         
            + JointTable.NAME + " TEXT, "
            + JointTable.FAMILY + " TEXT, "
            + JointTable.ADDRESS + " TEXT, "
            + JointTable.PARTICIPATIONNUM +" TEXT, "
            + JointTable.RECOGNITIONNUM + " TEXT, "
            + JointTable.USAGE + " TEXT ); ");
    

    【讨论】:

    • “database=schemaHelper.getWritableDatabase();”这一行有错误
    猜你喜欢
    • 2015-05-17
    • 2017-11-01
    • 2021-05-21
    • 1970-01-01
    • 2021-06-29
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多