简体   繁体   English

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

[英]Unable to insert data into database within fragment

I'm using fragment to create tabs, and I'm trying to insert information from the fragment to my database. 我正在使用片段创建选项卡,并且试图将信息从片段插入到数据库中。

So I've 3 RadioGroup and I'm adding to the database the 'Checked' radio button that the user has marked, and I'm not able to add into the database the data because the following error: 因此,我拥有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 尝试在null对象上调用虚拟方法'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String,int,android.database.sqlite.SQLiteDatabase $ CursorFactory,android.database.DatabaseErrorHandler)参考

There are DatabaseHandler functions (which works) that I use such as 我使用了一些DatabaseHandler函数(有效),例如

db.checkSetting() - Check if the database table is empty, if empty return false, if not return true. db.checkSetting()-检查数据库表是否为空,如果为空,则返回false,否则返回true。

db.updateSetting() - Update the data inside the table. db.updateSetting()-更新表中的数据。

db.addSetting() - Create new table with new data. 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) });
    }

Fragment: 分段:

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

How can I insert data into database within fragment and avoiding NullPointerException? 如何在片段内将数据插入数据库并避免NullPointerException?

You're calling 你在打电话

DatabaseHandler db = new DatabaseHandler(getActivity());

before the Activity is even attached to the Fragment. 在Activity甚至附加到Fragment之前。 Initialise it in the onCreate() , or onAttach() method, so getActivity() doesn't return null. 使用onCreate()onAttach()方法对其进行初始化,因此getActivity()不会返回null。

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 尝试在null对象上调用虚拟方法'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String,int,android.database.sqlite.SQLiteDatabase $ CursorFactory,android.database.DatabaseErrorHandler)参考

According to Exception You Have to open database before querying from it follow the below linked post 根据例外,您必须先打开数据库,然后才能从数据库中查询以下链接的文章

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 应用卸载时的SQLite数据库状态

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM