0

データベースを使用するソース コードがあります。
私のデータベース コードはクラス内にあり、このクラスから何かを挿入しても問題はありません。しかし、メソッドが他のクラスで呼び出された場合、この行からエラーメッセージ「 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");

理由が知りたいです よろしくお願いします

4

3 に答える 3

0

コンストラクタでshnullを渡しているのでnullらしいので変更SchemaHelper

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

SchemaHelper sh = new SchemaHelper(MainActivity.this);

また、create 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 );");

  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();
于 2014-11-15T11:21:41.013 に答える