Добавить новую таблицу с другим файлом класса sqlhelper в помощник в Android Studio - PullRequest
0 голосов
/ 27 ноября 2018

Я уже создал базу данных и таблицу в ней.Теперь я хочу добавить еще одну таблицу в базу данных с новой таблицей в ней.

package com.example.user.shopkeeper.sql;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.user.shopkeeper.model.User;

import java.util.ArrayList;
import java.util.List;

public class DatabaseHelper extends SQLiteOpenHelper {

        private static final int DATABASE_VERSION = 1;
        private static final String DATABASE_NAME = "manager.db";
        private static final String TABLE_USER = "user";

        private static final String COLUMN_USER_ID = "user_id";
        private static final String COLUMN_USER_NAME = "user_name";
        private static final String COLUMN_USER_EMAIL = "user_email";
        private static final String COLUMN_USER_PASSWORD = "user_password";
        private static final String COLUMN_USER_MOBILE_NUMBER = "user_mobile_number";

        private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "("
                + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_USER_NAME + " TEXT, "
                + COLUMN_USER_EMAIL + " TEXT, " + COLUMN_USER_PASSWORD + " TEXT, "+  COLUMN_USER_MOBILE_NUMBER + " TEXT" + ")";

        private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER;

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

        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL(CREATE_USER_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
            db.execSQL(DROP_USER_TABLE);
            onCreate(db);
        }

        public void addUser(User user){
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(COLUMN_USER_NAME,user.getName());
            values.put(COLUMN_USER_EMAIL,user.getEmail());
            values.put(COLUMN_USER_PASSWORD,user.getPassword());
            values.put(COLUMN_USER_MOBILE_NUMBER,user.getNumber());

            db.insert(TABLE_USER,null,values);
            db.close();
        }

        public boolean checkUser(String email, String password){
            String[] columns = {
                    COLUMN_USER_ID
            };

            SQLiteDatabase db = this.getWritableDatabase();
            String selection = COLUMN_USER_EMAIL + " = ?" + " AND " + COLUMN_USER_PASSWORD + " = ? ";
            String[] selectionArgs = {email , password};

            Cursor cursor = db.query(TABLE_USER,
                    columns,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    null );

            int cursorCount = cursor.getCount();
            cursor.close();
            db.close();

            if(cursorCount > 0){
                return true;
            }
            else{
                return false;
            }

        }


        public boolean checkUser(String email){
            String[] columns = {
                    COLUMN_USER_ID
            };

            SQLiteDatabase db = this.getWritableDatabase();
            String selection = COLUMN_USER_EMAIL + " = ?" ;
            String[] selectionArgs = {email};

            Cursor cursor = db.query(TABLE_USER,
                    columns,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    null );

            int cursorCount = cursor.getCount();
            cursor.close();
            db.close();

            if(cursorCount > 0){
                return true;
            }
            else{
                return false;
            }

        }

        public List<String> getContactNumber(String email){
            List<String> a = new ArrayList<>();
            String[] contact = new String[]{email};
            SQLiteDatabase db = this.getReadableDatabase();
            String query = "SELECT " + COLUMN_USER_MOBILE_NUMBER +", " + COLUMN_USER_ID + ", " +COLUMN_USER_NAME + " FROM " + TABLE_USER + " WHERE " + COLUMN_USER_EMAIL + " =?";
            Cursor c = db.rawQuery(query, contact);

            if(c.moveToFirst()){
                a.add(c.getString(c.getColumnIndex(COLUMN_USER_MOBILE_NUMBER)));
                a.add(c.getString(c.getColumnIndex(COLUMN_USER_NAME)));
                a.add(c.getString(c.getColumnIndex(COLUMN_USER_ID)));

            }

            db.close();
            c.close();
            return a;
        }

}

Еще один: -

package com.example.user.shopkeeper.sql;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;

import com.example.user.shopkeeper.model.User;

public class AddClientUser extends SQLiteOpenHelper implements BaseColumns{


    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "manager.db";

    private final static String TABLE_CLIENT = "clients";
    private final static String _ID = BaseColumns._ID;
    private final static String COLUMN_USER_ID = "user_id";
    private final static String CLIENT_USER_ID = "client_user_id";
    private final static String COLUMN_CLIENT_NAME = "name";
    private final static String COLUMN_CLIENT_GENDER = "gender";
    private final static String COLUMN_CLIENT_MOBILE_NUMBER = "mobile_number";
    private final static String COLUMN_AMOUNT = "amount";
    public final static int GENDER_UNKNOWN = 0;
    public final static int GENDER_MALE = 1;
    public final static int GENDER_FEMALE = 2;

    private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_CLIENT + "( "
            + CLIENT_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_USER_ID + " INTEGER, "
            + COLUMN_CLIENT_NAME + " TEXT, " + COLUMN_CLIENT_MOBILE_NUMBER + " TEXT, " + COLUMN_CLIENT_GENDER + " TEXT, "
            + COLUMN_AMOUNT + " INTEGER" + " )";



    private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_CLIENT;

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

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_USER_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL(DROP_USER_TABLE);
        onCreate(db);
    }

    public boolean checkUserMobile(String contact){
        String[] columns = {
                CLIENT_USER_ID
        };

        SQLiteDatabase db = this.getReadableDatabase();
        String selection = COLUMN_CLIENT_MOBILE_NUMBER  + " =? ";
        String[] selectionArgs = {contact};
        Cursor cursor = db.query(TABLE_CLIENT,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null );

        int count = cursor.getCount();
        cursor.close();
        db.close();

        if(count > 0){
            return true;
        } else{
            return false;
        }
    }

    public void addClient(User user){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_ID,user.getUserId());
        values.put(COLUMN_CLIENT_NAME,user.getName());
        values.put(COLUMN_CLIENT_MOBILE_NUMBER,user.getNumber());
        values.put(COLUMN_CLIENT_GENDER,user.getGender());
        values.put(COLUMN_AMOUNT,user.getAmount());

        db.insert(TABLE_CLIENT,null,values);
        db.close();
    }

}

Я хочу знать, как добавить таблицу с этим в существующую базу данных.Он включает в себя некоторый раздел обновления, который нужно изменить, и я не могу его найти.Я новичок в Android и не могу найти правильный код для его изменения.

Ошибка, которую я получил, заключается в том, что клиенты таблицы не найдены.

1 Ответ

0 голосов
/ 27 ноября 2018

Причина, по которой вы получаете (будете получать) таблицу, не найденную, заключается в том, что база данных хранится на диске, то есть она постоянна.Он создается один раз.Как только он существует, он не создается заново.Как таковой (в отличие от, скажем, действия) метод onCreate запускается только один раз за время существования базы данных (если не вызывается иначе, например, вы часто будете видеть, что он вызывается из метода onUpgrade).таким образом, вы должны спроектировать использование onCreate соответственно.

В вашем случае, возможно, самый простой способ - объединить два класса, например

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2; //<<<<<<<<<< Changed so will call onUpgrade
    private static final String DATABASE_NAME = "manager.db";
    private static final String TABLE_USER = "user";

    private static final String COLUMN_USER_ID = "user_id";
    private static final String COLUMN_USER_NAME = "user_name";
    private static final String COLUMN_USER_EMAIL = "user_email";
    private static final String COLUMN_USER_PASSWORD = "user_password";
    private static final String COLUMN_USER_MOBILE_NUMBER = "user_mobile_number";

    private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "("
            + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_USER_NAME + " TEXT, "
            + COLUMN_USER_EMAIL + " TEXT, " + COLUMN_USER_PASSWORD + " TEXT, "+  COLUMN_USER_MOBILE_NUMBER + " TEXT" + ")";

    private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER;


    private final static String TABLE_CLIENT = "clients";
    private final static String _ID = BaseColumns._ID;
    //private final static String COLUMN_USER_ID = "user_id";
    private final static String CLIENT_USER_ID = "client_user_id";
    private final static String COLUMN_CLIENT_NAME = "name";
    private final static String COLUMN_CLIENT_GENDER = "gender";
    private final static String COLUMN_CLIENT_MOBILE_NUMBER = "mobile_number";
    private final static String COLUMN_AMOUNT = "amount";
    public final static int GENDER_UNKNOWN = 0;
    public final static int GENDER_MALE = 1;
    public final static int GENDER_FEMALE = 2;

    private String CREATE_CLIENT_TABLE = "CREATE TABLE " + TABLE_CLIENT + "( "
            + CLIENT_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_USER_ID + " INTEGER, "
            + COLUMN_CLIENT_NAME + " TEXT, " + COLUMN_CLIENT_MOBILE_NUMBER + " TEXT, " + COLUMN_CLIENT_GENDER + " TEXT, "
            + COLUMN_AMOUNT + " INTEGER" + " )";

    private String DROP_CLIENT_TABLE = "DROP TABLE IF EXISTS " + TABLE_CLIENT;

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

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_USER_TABLE);
        db.execSQL(CREATE_CLIENT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL(DROP_USER_TABLE);
        db.execSQL(DROP_CLIENT_TABLE);
        onCreate(db);
    }

    public void addUser(User user){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_NAME,user.getName());
        values.put(COLUMN_USER_EMAIL,user.getEmail());
        values.put(COLUMN_USER_PASSWORD,user.getPassword());
        values.put(COLUMN_USER_MOBILE_NUMBER,user.getNumber());

        db.insert(TABLE_USER,null,values);
        db.close();
    }

    public boolean checkUser(String email, String password){
        String[] columns = {
                COLUMN_USER_ID
        };

        SQLiteDatabase db = this.getWritableDatabase();
        String selection = COLUMN_USER_EMAIL + " = ?" + " AND " + COLUMN_USER_PASSWORD + " = ? ";
        String[] selectionArgs = {email , password};

        Cursor cursor = db.query(TABLE_USER,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null );

        int cursorCount = cursor.getCount();
        cursor.close();
        db.close();

        if(cursorCount > 0){
            return true;
        }
        else{
            return false;
        }
    }

    public boolean checkUser(String email){
        String[] columns = {
                COLUMN_USER_ID
        };

        SQLiteDatabase db = this.getWritableDatabase();
        String selection = COLUMN_USER_EMAIL + " = ?" ;
        String[] selectionArgs = {email};

        Cursor cursor = db.query(TABLE_USER,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null );

        int cursorCount = cursor.getCount();
        cursor.close();
        db.close();

        if(cursorCount > 0){
            return true;
        }
        else{
            return false;
        }
    }

    public List<String> getContactNumber(String email){
        List<String> a = new ArrayList<>();
        String[] contact = new String[]{email};
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT " + COLUMN_USER_MOBILE_NUMBER +", " + COLUMN_USER_ID + ", " +COLUMN_USER_NAME + " FROM " + TABLE_USER + " WHERE " + COLUMN_USER_EMAIL + " =?";
        Cursor c = db.rawQuery(query, contact);

        if(c.moveToFirst()){
            a.add(c.getString(c.getColumnIndex(COLUMN_USER_MOBILE_NUMBER)));
            a.add(c.getString(c.getColumnIndex(COLUMN_USER_NAME)));
            a.add(c.getString(c.getColumnIndex(COLUMN_USER_ID)));

        }

        db.close();
        c.close();
        return a;
    }

    public boolean checkUserMobile(String contact){
        String[] columns = {
                CLIENT_USER_ID
        };

        SQLiteDatabase db = this.getReadableDatabase();
        String selection = COLUMN_CLIENT_MOBILE_NUMBER  + " =? ";
        String[] selectionArgs = {contact};
        Cursor cursor = db.query(TABLE_CLIENT,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null );

        int count = cursor.getCount();
        cursor.close();
        db.close();

        if(count > 0){
            return true;
        } else{
            return false;
        }
    }

    public void addClient(User user){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_ID,user.getUserId());
        values.put(COLUMN_CLIENT_NAME,user.getName());
        values.put(COLUMN_CLIENT_MOBILE_NUMBER,user.getNumber());
        values.put(COLUMN_CLIENT_GENDER,user.getGender());
        values.put(COLUMN_AMOUNT,user.getAmount());

        db.insert(TABLE_CLIENT,null,values);
        db.close();
    }
}
  • Обратите внимание на комментарий // <<<<<<<<<< Изменено так, что вызовет onUpgrade </p>

    • Это, как говорится, приведет к вызову метода onUpgrade, который удалит обе таблицы (теперь) и вызывает onCreate, который затем создает обе таблицы.
    • Если вы не хотите увеличивать версию базы данных (например, хотите оставить ее равной 1 при разработке приложения), тогда, при условии, что у вас нет данных дляСохраните, вы можете удалить данные приложения или удалить приложение и запустить его снова.
    • Если вам нужно сохранить существующие данные, вам нужно будет задать другой вопрос, так как это выходит за рамки этого вопроса (VIв состоянии, хотя).
  • Вы можете заметить, что строка //private final static String COLUMN_USER_ID = "user_id"; была закомментирована, потому что COLUMN_USER_ID было определено в обоих исходных классах.

  • Обратите внимание, что методы onUpgrade и onCreate были изменены для размещения обеих таблиц.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...