Создание таблицы в базе данных SQLite не работает должным образом - PullRequest
1 голос
/ 03 июня 2019

Я делаю приложение для Android и хочу отправить данные в базу данных SQLite.Как мне код для этого?

Так я создаю таблицу

public class DBHelper extends SQLiteOpenHelper {

    private final static String DATABASE_NAME = "UserInfo.db";

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        String CREATE_TABLE =
                "CREATE TABLE " + UserProfile.Users.TABLE_NAME + " (" +
                        UserProfile.Users._ID + " INTEGER PRIMARY KEY," +
                        UserProfile.Users.COLUMN_USERNAME + " TEXT," +
                        UserProfile.Users.COLUMN_DOB + " TEXT," +
                        UserProfile.Users.COLUMN_GENDER + " TEXT," +
                        UserProfile.Users.COLUMN_PASSWORD + " TEXT )";

        sqLiteDatabase.execSQL(CREATE_TABLE);
    }

Это метод onUpgrade в этом коде

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

    }

Вот как я добавляю метод addInfo в этот класс

public long addInfo(String username, String password){

        SQLiteDatabase sqLiteDatabase = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(UserProfile.Users.COLUMN_USERNAME, username);
        contentValues.put(UserProfile.Users.COLUMN_PASSWORD, password);

        long rowId = sqLiteDatabase.insert(UserProfile.Users.TABLE_NAME, null, contentValues);

        return rowId;
    }

    public int updateInfo(String userId, String userName, String password, String dob, String gender){

        SQLiteDatabase sqLiteDatabase = getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(UserProfile.Users.COLUMN_USERNAME, userName);
        values.put(UserProfile.Users.COLUMN_PASSWORD, password);
        values.put(UserProfile.Users.COLUMN_GENDER, gender);
        values.put(UserProfile.Users.COLUMN_DOB, dob);

        String selection = UserProfile.Users._ID + " = ?";
        String args[] = {userId};

        int count = sqLiteDatabase.update(UserProfile.Users.TABLE_NAME, values, selection, args);

        return count;
    }

Ниже приведен список Array readAllInfo

public ArrayList readAllInfo(){

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String[] projection = {

                UserProfile.Users._ID,
                UserProfile.Users.COLUMN_USERNAME,
                UserProfile.Users.COLUMN_DOB,
                UserProfile.Users.COLUMN_GENDER,
                UserProfile.Users.COLUMN_PASSWORD
        };

Код, который я использовал для сортировки заказа, приведен ниже

String sortOrder = UserProfile.Users._ID + " DESC";

        Cursor cursor = sqLiteDatabase.query(
                UserProfile.Users.TABLE_NAME,
                projection,
                null,
                null,
                null,
                null,
                sortOrder
        );

        ArrayList<User> list = new ArrayList<>();

        if (cursor.getCount() > 0){

            while(cursor.moveToNext()){

                User newUser = new User();

                int id = cursor.getInt(cursor.getColumnIndexOrThrow(UserProfile.Users._ID));
                String user = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_USERNAME));
                String date = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_DOB));
                String gen = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_GENDER));
                String pass = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_PASSWORD));

                newUser.setUserId(id+"");
                newUser.setUserName(user);
                newUser.setDateOfBirth(date);
                newUser.setGender(gen);
                newUser.setPassword(pass);

                list.add(newUser);
            }
        }

        return list;
    }

Список массивов, который я использую для метода readAllInfo:

public ArrayList readAllInfo(String userId, String userName){

        String selection;
        String[] args = {""};

        if(userId == null){

            selection = UserProfile.Users.COLUMN_USERNAME + " LIKE ?";
            args[0] = userName;
        }
        else
        {
            selection = UserProfile.Users._ID + " = ?";
            args[0] = userId;
        }

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String[] projection = {

                UserProfile.Users._ID,
                UserProfile.Users.COLUMN_USERNAME,
                UserProfile.Users.COLUMN_DOB,
                UserProfile.Users.COLUMN_GENDER,
                UserProfile.Users.COLUMN_PASSWORD
        };



        String sortOrder = UserProfile.Users._ID + " DESC";

        Cursor cursor = sqLiteDatabase.query(
                UserProfile.Users.TABLE_NAME,
                projection,
                selection,
                args,
                null,
                null,
                sortOrder
        );

        ArrayList<User> list = new ArrayList<>();

        if (cursor.getCount() > 0){

            while(cursor.moveToNext()){

                User newUser = new User();

                int id = cursor.getInt(cursor.getColumnIndexOrThrow(UserProfile.Users._ID));
                String user = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_USERNAME));
                String date = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_DOB));
                String gen = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_GENDER));
                String pass = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_PASSWORD));

                newUser.setUserId(id+"");
                newUser.setUserName(user);
                newUser.setDateOfBirth(date);
                newUser.setGender(gen);
                newUser.setPassword(pass);

                list.add(newUser);
            }
        }

        return list;
    }

    public int deleteInfo(String username){

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String selection = UserProfile.Users._ID + " = ?";
        String[] args = {username};

        int deletedRows = sqLiteDatabase.delete(UserProfile.Users.TABLE_NAME, selection, args);

        return deletedRows;
    }
}

1 Ответ

2 голосов
/ 04 июня 2019

Запуск вашего кода, он работает, поэтому проблема заключается в том, что вы используете для определения того, что он не работает.

  • Существует одна аномалия как таковая, а именно: deleteInfo метод использует userName для имени переданного аргумента, НО удаляет в соответствии с userId .

В качестве примера, используя ваш код и сследующее в задании: -

public class MainActivity extends AppCompatActivity {

    DBHelper mDBHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHelper = new DBHelper(this);
        mDBHelper.addInfo("UserFred","passwordforfred");
        mDBHelper.addInfo("UserMary","passwordformary");
        mDBHelper.updateInfo("1","UserWasFred","fred","2019-01-01","x");
        mDBHelper.updateInfo("2","UserEasMary","Mary","2019-02-01","Y");
        ArrayList<User> allusers = mDBHelper.readAllInfo();
        for (User u: allusers) {
            Log.d("USERINFO1","User is " + u.getUserName() + " DOB is " + u.getDateOfBirth());
        }
        ArrayList<User> auser = mDBHelper.readAllInfo("1","UserWasFred");
        for (User u: auser) {
            Log.d("USERINFO2","User is " + u.getUserName() + " DOB is " + u.getDateOfBirth());
        }
        mDBHelper.addInfo("UselessUser","useless");
        allusers = mDBHelper.readAllInfo();
        for (User u: allusers) {
            Log.d("USERINFO3","User is " + u.getUserName() + " DOB is " + u.getDateOfBirth());
        }
        mDBHelper.deleteInfo("Uselessuser");
        allusers = mDBHelper.readAllInfo();
        for (User u: allusers) {
            Log.d("USERINFO4","User is " + u.getUserName() + " DOB is " + u.getDateOfBirth());
        }
        mDBHelper.deleteInfo("3"); //<<<<<<<<<<< Works but userId passed
        allusers = mDBHelper.readAllInfo();
        for (User u: allusers) {
            Log.d("USERINFO5","User is " + u.getUserName() + " DOB is " + u.getDateOfBirth());
        }
    }
}

Вывод в журнал показывает, что все вышеперечисленное сделало то, что ожидалось согласно: -

06-04 08:04:53.874 D/USERINFO1: User is UserEasMary DOB is 2019-02-01
06-04 08:04:53.874 D/USERINFO1: User is UserWasFred DOB is 2019-01-01
06-04 08:04:53.875 D/USERINFO2: User is UserWasFred DOB is 2019-01-01
06-04 08:04:53.880 D/USERINFO3: User is UselessUser DOB is null
06-04 08:04:53.880 D/USERINFO3: User is UserEasMary DOB is 2019-02-01
06-04 08:04:53.880 D/USERINFO3: User is UserWasFred DOB is 2019-01-01
06-04 08:04:53.880 D/USERINFO4: User is UselessUser DOB is null
06-04 08:04:53.880 D/USERINFO4: User is UserEasMary DOB is 2019-02-01
06-04 08:04:53.880 D/USERINFO4: User is UserWasFred DOB is 2019-01-01
06-04 08:04:53.887 D/USERINFO5: User is UserEasMary DOB is 2019-02-01
06-04 08:04:53.887 D/USERINFO5: User is UserWasFred DOB is 2019-01-01
...