Как создать базу данных только один раз, затем читать и писать несколько раз из нее, SQLite, OpenHelper, Android

Я создал два класса, основной класс, который расширяет Activity и класс Database, который содержит базу данных и ее методы. Части кода из класса базы данных показаны ниже.

Класс SQLiteOpenHelper – это вложенный класс внутри класса базы данных. Я взял это с примера, который я нашел в Интернете. Внутри этого вложенного класса есть метод,

db.execSQL(SCRIPT_CREATE_DATABASE); 

Как создать новую базу данных? Если я создаю экземпляр класса Database из класса Main следующим образом:

 Database db = new Database(this); 

Создает ли этот экземпляр автоматически экземпляр вложенного класса SQLiteOpenHelper? Поэтому мне не нужно явно это делать.

Однако для этого примера того, как создать базу данных, я запутался. Если каждый раз, когда я создаю экземпляр нового экземпляра, вызывающего метод addNewRow (), например:

  public void addNewRow(String label, int price){ Database db = new Database(context); db.openToWrite(); db.insertNewRow(checkBoxStatus, label, price); db.close(); } 

То в вызове «новая база данных (контекст)» создается новая база данных, а затем я добавляю информацию для ввода столбцов. И, наконец, вызовите db.close (), однако каждый раз, когда я вызываю метод addNewRow, показанный выше, он будет создавать новую базу данных, а также создает экземпляр класса SQLiteOpenhelper, чтобы создать новую базу данных. Это означает, что последняя база данных была перезаписана, и моя последняя добавленная строка потеряна, это правильно?

Как я могу использовать этот класс базы данных для создания базы данных только один раз, а затем читать и писать с нее вещи с помощью нескольких вызовов, подобных этому?

  Database db = new Database(context); db.openToWrite(); or db.openToRead(); // read or update or create new row in database db.close(); 

Класс базы данных:

  public class Database { public static final String MYDATABASE_NAME = "my_database"; public static final String MYDATABASE_TABLE = "my_table"; public static final int MYDATABASE_VERSION = 1; public static final String KEY_CHECKBOX_STATUS = "check_box_status"; public static final String KEY_CHECKBOX_LABEL = "check_box_label"; public static final String KEY_PRICE = "price"; //create table MY_DATABASE (ID integer primary key, Content text not null); private static final String SCRIPT_CREATE_DATABASE = "CREATE TABLE " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");"; SQLiteDatabase sqLiteDatabase; SQLiteHelper sqLiteHelper; Context context; public Database(Context c){ context = c; } // after this all the rest of the methods for get and set of database values 

Код для класса SQLiteOpenHelper, вложенный внутри класса базы данных:

  public class SQLiteHelper extends SQLiteOpenHelper { public SQLiteHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(SCRIPT_CREATE_DATABASE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } } 

Да, каждый раз, когда вы создаете экземпляр класса базы данных, SQLiteHelper создает экземпляр. Но SQLiteHelper onCreate вызывается только в том случае, если база данных не существует. Вы можете проверить это, добавив новый столбец в одну из таблиц, а затем попытайтесь вставить строку, имеющую значение в этом столбце, после чего ваше приложение выйдет из строя. Ошибка будет «нет такого столбца». Затем вам необходимо очистить данные или изменить версию своей базы данных или удалить приложение, чтобы обновить таблицу изменений.

Всякий раз, когда вы хотите просто открыть свою базу данных, вам необходимо использовать это:

 myDatabase = myOpenHelper.getWritableDatabase(); 

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

Обратитесь к этому, чтобы получить четкое представление о том, как работает база данных в Sqlite. Надеюсь, поможет.

 private static final String SCRIPT_CREATE_DATABASE = "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");"; 

Используйте этот запрос при создании таблицы. Он создаст таблицу, если она не существует.