无法在片段内将数据插入数据库

时间:2017-05-27 12:37:17

标签: java android sqlite android-fragments

我正在使用片段创建标签,我正在尝试将片段中的信息插入到我的数据库中。

所以我有3个RadioGroup,我在数据库中添加了用户标记的'Checked'单选按钮,我无法将数据添加到数据库中,因为出现以下错误:

  

尝试调用虚方法   “android.database.sqlite.SQLiteDatabase   android.content.Context.openOrCreateDatabase(java.lang.String,int,   android.database.sqlite.SQLiteDatabase $ CursorFactory,   android.database.DatabaseErrorHandler)'对空对象引用

我使用的是DatabaseHandler函数(可以工作),例如

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?

2 个答案:

答案 0 :(得分:3)

你正在打电话

DatabaseHandler db = new DatabaseHandler(getActivity());
在活动甚至附加到片段之前

。在onCreate()onAttach()方法中对其进行初始化,因此getActivity()不会返回null。

答案 1 :(得分:1)

  

尝试调用虚方法   “android.database.sqlite.SQLiteDatabase   android.content.Context.openOrCreateDatabase(java.lang.String,int,   android.database.sqlite.SQLiteDatabase $ CursorFactory,   android.database.DatabaseErrorHandler)'对空对象引用

根据例外情况您必须在查询数据库之前打开数据库,请按照以下链接的帖子进行操作

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