2017-05-27 98 views
1

我正在使用片段來創建選項卡,並試圖將片段中的信息插入到我的數據庫中。無法將數據插入片段中的數據庫

所以我3 RadioGroup中,我加入數據庫用戶已標誌着「經過」單選按鈕,我不能添加到數據庫中的數據,因爲以下錯誤:

Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

有數據庫處理器功能(工作),我使用諸如

db.checkSetting() - 檢查數據庫表是空的,如果爲空返回false,如果不返回true。

db.updateSetting() - 更新表中的數據。

db.addSetting() - 用新數據創建新表。

public class DatabaseHandler extends SQLiteOpenHelper { 

    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "database.db"; 

    //table name 
    private static final String TABLE_DETAILS = "details"; 
    private static final String TABLE_FOOD = "food"; 
    private static final String TABLE_OLDDETAILS = "oldDetails"; 
    private static final String TABLE_SETTING = "setting"; 

    //Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_HEIGHT = "height"; 
    private static final String KEY_WEIGHT = "weight"; 
    private static final String KEY_CALORIES = "calories"; 
    private static final String KEY_DATE = "date"; 
    private static final String KEY_LEVEL = "level"; 
    private static final String KEY_DURATION = "duration"; 
    private static final String KEY_DAYS = "days"; 


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

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_DETAILS_TABLE = "CREATE TABLE " + TABLE_DETAILS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_HEIGHT + " REAL," + KEY_WEIGHT + " REAL " + ")"; 
     String CREATE_FOOD_TABLE = "CREATE TABLE " + TABLE_FOOD + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_CALORIES + " INTEGER " + ")"; 
     String CREATE_OLDDETAILS_TABLE = "CREATE TABLE " + TABLE_OLDDETAILS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT," + KEY_HEIGHT + " REAL," + KEY_WEIGHT + " REAL " + ")"; 
     String CREATE_SETTING_TABLE = "CREATE TABLE " + TABLE_SETTING + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_LEVEL + " INTEGER," + KEY_DURATION + " INTEGER," + KEY_DAYS + " INTEGER " + ")"; 

     db.execSQL(CREATE_OLDDETAILS_TABLE); 
     db.execSQL(CREATE_DETAILS_TABLE); 
     db.execSQL(CREATE_FOOD_TABLE); 
     db.execSQL(CREATE_SETTING_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_DETAILS); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_OLDDETAILS); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_FOOD); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTING); 

     // Create tables again 
     onCreate(db); 
    } 
public boolean addSetting(int level, int duration, int days) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_ID, 1); 
     values.put(KEY_LEVEL, level); 
     values.put(KEY_DURATION, duration); 
     values.put(KEY_DAYS, days); 

     // Inserting Row 
     long result = db.insert(TABLE_SETTING, null, values); 
     if(result == -1){ 
      return false; 
     } 
     else{ 
      return true; 
     } 
    } 
    public boolean checkSetting(){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String selectQuery = "SELECT * FROM " + TABLE_SETTING; 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     Boolean rowExists; 

     if (cursor.moveToFirst()) 
     { 
      // DO SOMETHING WITH CURSOR 
      rowExists = true; 

     } else 
     { 
      // I AM EMPTY 
      rowExists = false; 
     } 
     return rowExists; 
    } 
    public setting getSetting() { 
     String selectQuery = "SELECT * FROM " + TABLE_SETTING; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 
     setting set = new setting(cursor.getInt(1), cursor.getInt(2), cursor.getInt(3)); 

     return set; 
    } 
    public int updateSetting(setting set) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_LEVEL, set.getLevel()); 
     values.put(KEY_DURATION, set.getDuration()); 
     values.put(KEY_DAYS, set.getDays()); 
     Log.d("UPDATE: ", "updated all"); 

     // updating row 
     return db.update(TABLE_SETTING, values, KEY_ID + " = ?", new String[] { String.valueOf(1) }); 
    } 

片段:

public class PageFragment extends Fragment { 
    DatabaseHandler db = new DatabaseHandler(getActivity()); //DATABASE 
    private int group1; 
    private int group2; 
    private int group3; 
    public static final String ARG_PAGE = "ARG_PAGE"; 

    private int mPage; 

    public static PageFragment newInstance(int page) { 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, page); 
     PageFragment fragment = new PageFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPage = getArguments().getInt(ARG_PAGE); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_training, container, false); 
     ViewStub stub = (ViewStub) view.findViewById(R.id.stub); 
     if(mPage == 1) { // mPage represents the ID of the tab/page/fragment that in use. 
      stub.setLayoutResource(R.layout.fragment_trainingone); // Sets resource for each fragment 
      View inflated = stub.inflate(); 
      return inflated; 
     } 
     else{ 
      stub.setLayoutResource(R.layout.fragment_trainingtwo); 
      View inflated = stub.inflate(); 
      RadioGroup rg1 = (RadioGroup) inflated.findViewById(R.id.group1); 
      RadioGroup rg2 = (RadioGroup) inflated.findViewById(R.id.group2); 
      RadioGroup rg3 = (RadioGroup) inflated.findViewById(R.id.group3); 
      Button update = (Button) inflated.findViewById(R.id.update); 
      rg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
      { 
       public void onCheckedChanged(RadioGroup group, int checkedId) { 
        switch(checkedId){ 
         case R.id.radio1: 
          group1 = 1; 
          break; 
         case R.id.radio2: 
          group1 = 2; 
          break; 
         case R.id.radio3: 
          group1 = 3; 
          break; 
        } 
       } 
      }); 
      rg2.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
      { 
       public void onCheckedChanged(RadioGroup group, int checkedId) { 
        switch(checkedId){ 
         case R.id.radio11: 
          group2 = 1; 
          break; 
         case R.id.radio22: 
          group2 = 2; 
          break; 
         case R.id.radio33: 
          group2 = 3; 
          break; 
        } 
       } 
      }); 
      rg3.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
      { 
       public void onCheckedChanged(RadioGroup group, int checkedId) { 
        switch(checkedId){ 
         case R.id.radio111: 
          group3 = 1; 
          break; 
         case R.id.radio222: 
          group3 = 2; 
          break; 
         case R.id.radio333: 
          group3 = 3; 
          break; 
        } 
       } 
      }); 
      update.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(android.view.View v) { 
        setting set = new setting(group1, group2, group3); 
        if (db.checkSetting()) { 
         db.updateSetting(set); 
        } else { 
         db.addSetting(group1, group2, group3); 
        } 
       } 
      }); 
      return inflated; 
     } 
    } 
} 

我如何將數據插入到數據庫片段中,避免NullPointerException異常?

回答

3

你打電話

DatabaseHandler db = new DatabaseHandler(getActivity()); 
活動前

即使連接到片段。在onCreate()onAttach()方法中初始化它,因此getActivity()不會返回null。

1

Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

根據異常你有查詢從它遵循下面鏈接後前打開數據庫

public void openDataBase() throws SQLException 
    { 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

SQLite database status on app uninstall

相關問題