0

У меня есть исходный код, использование базы данных.
Мои коды базы данных находятся в классе, и когда я вставляю что-нибудь из этого класса не существует никаких проблем. Но если вызов метода в другом классе сообщения «java.lang.NullPointerException» ошибка будет показан от этой линии SQLiteDatabase sd = getWritableDatabase();
Ошибки при изменении базы данных для метода 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"); 

Я хочу знать, почему благодарственное-х

+0

Вы пропустили пробел здесь: 'db.execSQL (« CREATE TABLE »+ JointTable.TABLE_NAME' должно быть' db.execSQL («CREATE TABLE» + JointTable.TABLE_NAME' или таблица вообще не будет создана –

ответ

1

Моя проблема решена с помощью вызова метода следующим образом:

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

Конструктор нужен getBaseContext() метод.

Благодаря всем вам помог мне.

0

Кажется, что sh равна нулю, потому что вы передаете нуль в SchemaHelper конструктор, поэтому изменить

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

в

SchemaHelper sh = new SchemaHelper(MainActivity.this); 

А также добавьте пробел в свою таблицу создания таблицы, .ie Изменение

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(); 
+0

Я изменил его, но все еще есть проблема. Он работает, но когда он вызывается из другого класса, будет показано сообщение – Khodayar

+0

@Khodayar попытается очистить проект, а также удалить существующее приложение. –

+0

Я делаю это, но это то же самое. – Khodayar

0

Сделать другой класс для простоты.

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; 
    } 

} 

В классе MainActivtity,

Insert insert=new Insert(MainActivity.this); 


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

Кроме того, если таблица не создается, добавить пробелы в SQL Statement. т.е.

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); "); 
+0

В этой строке есть ошибка «database = schemaHelper.g etWritableDatabase(); " – Khodayar

+0

Вы можете показать ошибку logcat, пожалуйста. – user3308752