【问题标题】:Unable to insert data into database within fragment无法将数据插入片段内的数据库
【发布时间】:2023-03-22 22:13:02
【问题描述】:

我正在使用片段来创建选项卡,并且我正在尝试将片段中的信息插入到我的数据库中。

所以我有 3 个 RadioGroup,我正在将用户标记的“已检查”单选按钮添加到数据库中,但由于以下错误,我无法将数据添加到数据库中:

尝试调用虚方法 '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?

【问题讨论】:

    标签: java android sqlite android-fragments


    【解决方案1】:

    你在打电话

    DatabaseHandler db = new DatabaseHandler(getActivity());
    

    在 Activity 甚至附加到 Fragment 之前。在onCreate()onAttach() 方法中对其进行初始化,因此getActivity() 不会返回null。

    【讨论】:

      【解决方案2】:

      尝试调用虚方法 '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

      【讨论】:

        猜你喜欢
        • 2012-04-13
        • 2013-03-02
        • 2021-07-23
        • 2017-10-24
        • 2015-02-22
        • 1970-01-01
        相关资源
        最近更新 更多