Чтобы добавить базу данных, после проектирования базы данных (допустим, вы хотите сохранить идентификатор пользователя (который может быть в другой пользовательской таблице), очевидно, bmi, а для исторических ссылок - дату и время, когда bmi за) то: -
Создание помощника по базам данных (DBHelper.java для демонстрации)
Первый шаг, если использовать SQLite на устройстве Android (предполагает сравнительно простой подход с использованием класса SQLiteOpenHelper
), это создать подкласс SQLiteOpenHelper (он же DBHelper), то есть класс, который расширяет SQLiteOpenHelper. например : -
public class DBhelper extends SQLiteOpenHelper {
...... stuff to be added as yet
}
Вам понадобится подходящий конструктор, который передаст контекст, имя базы данных, фабричный метод (null будет делать) и версию базы данных.
So the above could then become :-
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
}
Однако такой класс должен включать овериды для методов onCreate
и onUpgrade
.
- метод onCreate вызывается, когда база данных только что была создана (т.е. при первом вызове getReadableDatabase или getWritabledatabase).
- Примечание после создания базы данных метод
onCreate
не вызывается. То есть onCreate НЕ вызывается при каждом запуске приложения, так как после создания базы данных создается файл (data / data // database /)
- Изменение кода в методе
onCreate
НЕ БУДЕТ изменять базу данных, пока база данных не будет удалена (есть другие способы).
- Это очень распространенная проблема, поэтому и объясняется.
Таким образом, вышеприведенное теперь может быть: -
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
Предполагается, что база данных будет называться bmirecorder.db и что она будет иметь одну таблицу, которая будет называться bmirecord и что для каждой записи (строки) будет три поля (столбца), а именно record_userid, record_date и record_bmi. Желательно, чтобы эти имена были определены в одном месте и чтобы имя всегда получалось из этого единственного места и что это единственное место равняется константе, тогда мы должны добавить: -
public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1;
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";
- Выше будет добавлено в установленном порядке
Поскольку мы знаем, что база данных всегда будет одинаковой, и что версия базы данных не сильно изменится, и что мы не собираемся использовать фабрику. Конструктор можно упростить, просто передав контекст.
Таким образом, приведенный выше код можно изменить на: -
открытый класс DBHelper расширяет SQLiteOpenHelper {
public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1;
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";
public DBHelper(Context context) {
super(context, DBNAME, null, DBVESRION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
- Итак, константы были добавлены и некоторые использованы (DBNAME и DBVERSION)
- Чтобы создать экземпляр, в упражнении вы должны написать что-то вроде DBHelper myDBHelper = new DBHelper (this);
- Вышеописанное будет работать и фактически создаст пустую базу данных (но только если будет предпринята попытка использовать getReadableDatabase или getWritableDatabase).
Чтобы создать таблицу bmirecord, мы можем добавить код для создания таблицы в методе onCreate
. Такие как: -
String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_BMIRECORD +
"(" +
COLUMN_BMIRECORD_USERID + " INTEGER," +
COLUMN_BMIRECORD_DATE + " TEXT DEFAULT CURRENT_TIMESTAMP," +
COLUMN_BMIRECORD_BMI + " REAL NOT NULL" +
")";
sqLiteDatabase.execSQL(crtsql)
Таким образом, код теперь становится: -
открытый класс DBHelper расширяет SQLiteOpenHelper {
public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1;
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";
public DBHelper(Context context) {
super(context, DBNAME, null, DBVESRION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_BMIRECORD +
"(" +
COLUMN_BMIRECORD_USERID + " INTEGER," +
COLUMN_BMIRECORD_DATE + " TEXT DEFAULT CURRENT_TIMESTAMP," +
COLUMN_BMIRECORD_BMI + " REAL NOT NULL" +
")";
sqLiteDatabase.execSQL(crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
Приведенное выше создаст базу данных, когда / если будет предпринята попытка использовать getWritableDatabase
или getReadableDatabase
, но не только при создании экземпляра DBHelper.
Измените вашу MainActivity
Чтобы сделать и то, и другое, вы можете изменить свой MainActivity, чтобы включить: -
DBHelper myDBHelper = new DBHelper(this); //<<<< Creates an instance of the DBHelper
SQLiteDatabase db = myDBHelper.getWritableDatabase(); // Invoke getWritabelFatabase to create the database
например.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
height = (EditText) findViewById(R.id.height);
weight = (EditText) findViewById(R.id.weight);
result = (TextView) findViewById(R.id.result);
DBHelper myDBHelper = new DBHelper(this);
SQLiteDatabase db = myDBHelper.getWritableDatabase();
}
При запуске приложения теперь будет создана база данных.
Как проверить, существует ли база данных
Если вы создадите новый класс с именем CommonSQLiteUtilities, а затем скопируете код из этой ссылки , а затем добавите следующую строку CommonSQLiteUtilities.logDatabaseInfo(db);
согласно: -
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
height = (EditText) findViewById(R.id.height);
weight = (EditText) findViewById(R.id.weight);
result = (TextView) findViewById(R.id.result);
DBHelper myDBHelper = new DBHelper(this);
SQLiteDatabase db = myDBHelper.getWritableDatabase();
CommonSQLiteUtilities.logDatabaseInfo(db);
}
и запустите приложение, в журнале появится следующее: -
05-10 06:07:29.002 1300-1300/bmirecorder.mybmirecorder D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/bmirecorder.mybmirecorder/databases/bmirecorder.db
Database Version = 1
05-10 06:07:29.006 1300-1300/bmirecorder.mybmirecorder D/SQLITE_CSU: Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table Name = bmirecord Created Using = CREATE TABLE bmirecord(record_userid INTEGER,record_date TEXT DEFAULT CURRENT_TIMESTAMP,record_bmi REAL NOT NULL)
Table = bmirecord ColumnName = record_userid ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
Table = bmirecord ColumnName = record_date ColumnType = TEXT Default Value = CURRENT_TIMESTAMP PRIMARY KEY SEQUENCE = 0
Table = bmirecord ColumnName = record_bmi ColumnType = REAL Default Value = null PRIMARY KEY SEQUENCE = 0
Подтверждение того, что База данных существует и включает в себя таблицу bmirecord (таблицы android_metadata создаются SQLiteOpenHelper и используются для хранения локали).