Я новичок в разработке Android, и я хочу, чтобы я изучал приличные практики для занятий. Сейчас это мой класс базы данных, который в настоящее время позволяет мне создать новый экземпляр singleton, а также создать таблицу профилей, а также добавить/извлечь из таблицы профилей.Как лучше расположить свой класс базы данных SQLite в Android
Это мой код до сих пор:
public class DatabaseHelper extends SQLiteOpenHelper {
private static volatile SQLiteDatabase mDatabase;
private static DatabaseHelper mInstance = null;
private static Context mContext;
private static final String DB_NAME = "database.db";
private static final int DB_VERSION = 1;
public static final String PROFILES_TABLE = "PROFILES";
public static final String PROFILES_COLUMN_ID = "_ID";
public static final String PROFILES_COLUMN_NAME = "NAME";
private static final String DB_CREATE_PROFILES_TABLE =
"CREATE TABLE " + PROFILES_TABLE + " ("
+ PROFILES_COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ PROFILES_COLUMN_NAME + " TEXT UNIQUE NOT NULL)";
public static synchronized DatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new DatabaseHelper(context.getApplicationContext());
try {
mInstance.open();
}
catch (SQLException e) {
e.printStackTrace();
}
}
return mInstance;
}
private DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DB_CREATE_PROFILES_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onConfigure(SQLiteDatabase db){
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
}
public synchronized void open() throws SQLException {
mDatabase = getWritableDatabase();
}
public synchronized void close() {
mDatabase.close();
}
public synchronized long addNewProfile(String name) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.PROFILES_COLUMN_NAME, name);
return mDatabase.insertWithOnConflict(DatabaseHelper.PROFILES_TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
}
public synchronized Profile getProfileById(long profileId) {
Cursor cursor = mDatabase.query(
DatabaseHelper.PROFILES_TABLE, // table
new String[]{DatabaseHelper.PROFILES_COLUMN_ID, DatabaseHelper.PROFILES_COLUMN_NAME}, // column names
DatabaseHelper.PROFILES_COLUMN_ID + " = ?", // where clause
new String[]{profileId + ""}, // where params
null, // groupby
null, // having
null); // orderby
cursor.moveToFirst();
Profile profile = null;
if (!cursor.isAfterLast()) {
String profileName = getStringFromColumnName(cursor, DatabaseHelper.PROFILES_COLUMN_NAME);
profile = new Profile(profileId, profileName);
cursor.moveToNext();
}
cursor.close();
return profile;
}
public synchronized List<Profile> getAllProfiles() {
List<Profile> profiles = new ArrayList<>();
Cursor cursor = mDatabase.query(
DatabaseHelper.PROFILES_TABLE, // table
new String[]{DatabaseHelper.PROFILES_COLUMN_ID, DatabaseHelper.PROFILES_COLUMN_NAME}, // column names
null, // where clause
null, // where params
null, // groupby
null, // having
DatabaseHelper.PROFILES_COLUMN_NAME); // orderby
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
long profileId = getLongFromColumnName(cursor, DatabaseHelper.PROFILES_COLUMN_ID);
String profileName = getStringFromColumnName(cursor, DatabaseHelper.PROFILES_COLUMN_NAME);
profiles.add(new Profile(profileId, profileName));
cursor.moveToNext();
}
cursor.close();
return profiles;
}
private synchronized long getLongFromColumnName(Cursor cursor, String columnName) {
int columnIndex = cursor.getColumnIndex(columnName);
return cursor.getLong(columnIndex);
}
private synchronized String getStringFromColumnName(Cursor cursor, String columnName) {
int columnIndex = cursor.getColumnIndex(columnName);
return cursor.getString(columnIndex);
}
}
Для справки (это может или не может быть необходимым, но я отправляю его на всякий случай), мой профиль класса, который является то, что я использую в нескольких другие места в приложении:
public class Profile {
private long mId;
private String mName;
public Profile(long id, String name) {
mId = id;
mName = name;
}
public long getId() {
return mId;
}
public void setId(long id) {
mId = id;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
}
Мои вопросы:
Прилично будет хранить тьфу ld имена таблицы в классе базы данных, подобные этому, или я должен переместить его в свой отдельный класс (например, класс
ProfileSql
, который содержит все имена).Должен ли я как-то развязать логику запроса CRUD от этого класса? Как мне это сделать? Что делать, если у меня есть несколько таблиц, запросов, методов потоков и т. Д.? Все ли они тоже идут в своих собственных классах? Если я добавлю функции CRUD для нескольких таблиц, этот класс может стать очень большим очень быстро.
Должен ли я каким-то образом связать любой материал с этим классом моего профиля, который я использую в нескольких других местах в моем приложении? Например, следует ли включать в SQL-файл таблицы профилей таблицы (таблицу создания таблицы и имена таблиц/столбцов) в класс профиля или это не должно быть мешающим?
Как вы можете видеть, я в основном спрашиваю, куда идти. Сейчас я просто собираю все вместе в один класс базы данных.
Моя главная цель здесь:
Я надеюсь, что этот пример достаточно короткий, где кто-то может показать мне, как правильно реорганизовать все это, так что я могу взять эти навыки и применять их в будущем, как вещи усложняются.
Добавить модель конкретные методы для классов моделей, как getAllProfiles() к классу Profile. И добавьте DatabaseHelper вместе с другими аргументами в метод. Таким образом, DatabaseHelper действительно не знает, что модели и функциональные возможности будут разделены между разными классами моделей. –
Можете ли вы перефразировать? Извините, я не совсем понимаю. Вставить его? Как этот способ он не знает моделей и его разделять? Можете ли вы пояснить, что вы подразумеваете под этим? (может быть, с примером) – user6419910
Я отправлю пример, когда я дома;) –