2017-09-27 17 views
0

データベースに書き込もうとすると、アプリがクラッシュします。ここでAndroidのSQLiteデータベースへの書き込み

は私のデータベースのヘルパーです:

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "alarms.db"; 
    private static final String TABLE_NAME = "alarm_table"; 
    private static final String COL_1 = "ID"; 
    private static final String COL_2 = "NAME"; 
    //private static final String COL_3 = "DAYS"; 
    private static final String COL_4 = "RINGTONE"; 
    private static final String COL_5 = "HOUR"; 
    private static final String COL_6 = "MINUTE"; 

    private static final String TABLE_NAME_DAYS = "days_table"; 
    private static final String DAYS_COL_1 = "MONDAY"; 
    private static final String DAYS_COL_2 = "TUESDAY"; 
    private static final String DAYS_COL_3 = "WEDNESDAY"; 
    private static final String DAYS_COL_4 = "THURSDAY"; 
    private static final String DAYS_COL_5 = "FRIDAY"; 
    private static final String DAYS_COL_6 = "SATURDAY"; 
    private static final String DAYS_COL_7 = "SUNDAY"; 

    private SQLiteDatabase db; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db = getWritableDatabase(); 

     db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
       + COL_1 + " TEXT PRIMARY KEY NOT NULL, " 
       + COL_2 + " TEXT NOT NULL, " 
       + COL_4 + " TEXT NOT NULL, " 
       + COL_5 + " INTEGER NOT NULL, " 
       + COL_6 + " INTEGER NOT NULL" + 
     ");"); 

     db.execSQL("CREATE TABLE " + TABLE_NAME_DAYS + " (" 
       + COL_1 + " TEXT PRIMARY KEY NOT NULL, " 
       + DAYS_COL_1 + " TEXT, " 
       + DAYS_COL_2 + " TEXT, " 
       + DAYS_COL_3 + " TEXT, " 
       + DAYS_COL_4 + " TEXT, " 
       + DAYS_COL_5 + " TEXT, " 
       + DAYS_COL_6 + " TEXT, " 
       + DAYS_COL_7 + " TEXT" 
       + 
     ");"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int i, int i1) { 

    } 

    public boolean addObjectToDB(Alarm inData){ 
     boolean rValue = true; 
     long result; 

     Log.i("This is my super tag!!!", "running from addObjectToDB method!!"); 
     Log.i("This is my super tag!!!", inData.getName()); 
     Log.i("This is my super tag!!!", inData.getId()); 

     // ============== CV : start ============== 

     ContentValues cv = new ContentValues(); 

     cv.put(COL_1, inData.getId()); 
     cv.put(COL_2, inData.getName()); 
     //  COL_3 - DAYS 
     cv.put(COL_4, inData.getRingtone().toString()); 
     cv.put(COL_5, inData.getHour()); 
     cv.put(COL_6, inData.getMinute()); 

     result = db.insert(TABLE_NAME, null, cv); //I did some extensive testing and this is the point when the app first crashes 

     if(result == -1){ 
      rValue = false; 
     } 
     else{ 
      // ============== CV2 : start ============== 

      ContentValues cv2 = new ContentValues(); 
      List<String> days = inData.getDays(); 

      cv2.put(COL_1, inData.getId()); 
      cv2.put(DAYS_COL_1, days.get(0)); 
      cv2.put(DAYS_COL_2, days.get(1)); 
      cv2.put(DAYS_COL_3, days.get(2)); 
      cv2.put(DAYS_COL_4, days.get(3)); 
      cv2.put(DAYS_COL_5, days.get(4)); 
      cv2.put(DAYS_COL_6, days.get(5)); 
      cv2.put(DAYS_COL_7, days.get(6)); 

      result = db.insert(TABLE_NAME_DAYS, null, cv2); 

      rValue = result != -1; 
     } 

     return rValue; 
    } 
} 

これらの三つの方法がMainActivityから来る:

@override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myDB = new DatabaseHelper(this); 

    ViewPager mViewPager = (ViewPager) findViewById(R.id.container); 
    setupViewPager(mViewPager); 

    TabLayout tabLayout = (TabLayout)findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 
} 


@Override 
@SuppressWarnings("unchecked") 
public void onResume(){ 
    super.onResume(); 

    Intent intent = getIntent(); 
    if(intent.hasExtra("AlarmList")){ 
     AlarmList = (List<Alarm>) intent.getSerializableExtra("AlarmList"); 
     Toast.makeText(MainActivity.this, "on resume..!", Toast.LENGTH_SHORT).show(); 
     testDB(); 
    } 
    else{ 
     AlarmList = new ArrayList(); 
    } 
} 

private void testDB(){ 
    boolean check = myDB.addObjectToDB(AlarmList.get(0)); 

    if(check){ 
     Toast.makeText(MainActivity.this, "Success!", Toast.LENGTH_SHORT).show(); 
    } 
    else{ 
     Toast.makeText(MainActivity.this, "Failure.. =(", Toast.LENGTH_LONG).show(); 
    } 
} 

私は問題が何であるかのためのクラッシュログをチェックしてみましたが、それは原因を表示しますクラッシュが発生すると、すぐに実際に切り替わります。私は、クラッシュログの半まともなスクリーンショットを取得するために管理しなかった、言っている:

できませんが、活動を再開する:java.lang.NullPointerExceptionが:java.lang.NullPointerExceptionが によって発生する試みは、仮想メソッドを呼び出すために "長いandroid.database.sqlite.SQLiteDatabse.insert(java.lang.Stringで、java.lang.Stringでandroid.c ...残りは...

を切った場合、私は間違って何をしているのですか?

+2

あなたはどこでどのように** myDB **を初期化しましたか? – Raghavendra

+0

は完全なコードを共有します – sumit

+1

[SQLiteに挿入しようとすると[NullPointerException]が重複する可能性があります - Android](https://stackoverflow.com/questions/14143886/nullpointerexception-when-trying-to-insert-into-sqlite-android) –

答えて

0

dbを初期化できませんでした

public boolean addObjectToDB(Alarm inData){ 

    //You missed this line 
    db = getWritableDatabase(); 

    boolean rValue = true; 
    long result; 

    Log.i("This is my super tag!!!", "running from addObjectToDB method!!"); 
    Log.i("This is my super tag!!!", inData.getName()); 
    Log.i("This is my super tag!!!", inData.getId()); 

    // ============== CV : start ============== 

    ContentValues cv = new ContentValues(); 

    cv.put(COL_1, inData.getId()); 
    cv.put(COL_2, inData.getName()); 
    //  COL_3 - DAYS 
    cv.put(COL_4, inData.getRingtone().toString()); 
    cv.put(COL_5, inData.getHour()); 
    cv.put(COL_6, inData.getMinute()); 

    result = db.insert(TABLE_NAME, null, cv); //I did some extensive testing and this is the point when the app first crashes 

    if(result == -1){ 
     rValue = false; 
    } 
    else{ 
     // ============== CV2 : start ============== 

     ContentValues cv2 = new ContentValues(); 
     List<String> days = inData.getDays(); 

     cv2.put(COL_1, inData.getId()); 
     cv2.put(DAYS_COL_1, days.get(0)); 
     cv2.put(DAYS_COL_2, days.get(1)); 
     cv2.put(DAYS_COL_3, days.get(2)); 
     cv2.put(DAYS_COL_4, days.get(3)); 
     cv2.put(DAYS_COL_5, days.get(4)); 
     cv2.put(DAYS_COL_6, days.get(5)); 
     cv2.put(DAYS_COL_7, days.get(6)); 

     result = db.insert(TABLE_NAME_DAYS, null, cv2); 

     rValue = result != -1; 
    } 

    return rValue; 
} 
+0

私はdb = getWritableDatabase()を持っていました。その方法ではじめる。それがうまくいかないときは、onCreateメソッドに移動しようとしましたが、これもうまくいきませんでした。私はそれを元に戻したが、それでも動作しない。 –

+0

あなたは現在エラーとして何を得ていますか? – Abhishek

+0

私はエラーをキャッチすることができません、それはあまりにも速く点滅し、消えるためです。しかし、私はHuaweiからSamsungに電話を変更しようとしました - それはサムスンでうまく動作します.. Huaweiは "E/ZipFileCache:initが開いたzipファイルで失敗しました"と言います「E/HAL:hw_get_module_by_class:lib loaded:/system/lib/hw/gralloc.msm8916.so」と「E/HAL:hw_get_module_by_class:lib loaded:/system/lib/hw/gralloc.msm8916.so」のいずれかを入力します。サムスンはそうではありません。私はこれが問題と関係があるかもしれないと思っていますか?おそらく何らかのパーミッションの問題がありますか? –

関連する問題