我剛剛開始學習Android開發,並且發現了一種在我的應用程序中編寫模型,DAO和模式的非常好的方法。例如,我有一個Category
模型,其中將包含所有的字段表示數據庫的表中的列:在Android中編寫數據庫CRUD操作的更有效方法
public class Category {
private int id;
private String name;
private String createdAt;
// Getters and Setters
}
的CategoryDao
類屆時將響應來訪問數據庫,並執行所有操作:
package com.prettypenny.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.prettypenny.model.Category;
import com.prettypenny.schema.CategorySchema;
import com.prettypenny.schema.DatabaseHandler;
import java.util.ArrayList;
/**
* Category D.A.O
*/
public class CategoryDao {
SQLiteOpenHelper helper;
SQLiteDatabase database;
private static final String[] columns = {
CategorySchema.COL_ID,
CategorySchema.COL_NAME,
CategorySchema.COL_CREATED_AT,
};
public CategoryDao(Context context) {
helper = new DatabaseHandler(context);
}
public void open() {
database = helper.getWritableDatabase();
}
public void close() {
helper.close();
}
/**
* Retrieve all Category
* @return ArrayList
*/
public ArrayList<Category> all() {
Cursor cursor = database.query(CategorySchema.TABLE_NAME, columns, null, null, null, null, null);
ArrayList<Category> categories = new ArrayList<>();
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Category category = new Category();
category.setId(cursor.getInt(cursor.getColumnIndex(CategorySchema.COL_ID)));
category.setName(cursor.getString(cursor.getColumnIndex(CategorySchema.COL_NAME)));
categories.add(category);
}
}
return categories;
}
/**
* Inserts a new Category
* @param category Category category to be inserted
* @return Category
*/
public Category insert(Category category) {
ContentValues values = new ContentValues();
values.put(CategorySchema.COL_NAME, category.getName());
database.insert(CategorySchema.TABLE_NAME, null, values);
return category;
}
/**
* Updates an existing Category
* @param category Category category to be updated
* @return int
*/
public int update(Category category) {
ContentValues values = new ContentValues();
values.put(CategorySchema.COL_NAME, category.getName());
return database.update(
CategorySchema.TABLE_NAME,
values,
CategorySchema.COL_ID + " = ?",
new String[] { String.valueOf(category.getId()) }
);
}
/**
* Deletes an existing Category
* @param id int id of the category to be deleted
*/
public void delete(int id) {
database.delete(
CategorySchema.TABLE_NAME,
CategorySchema.COL_ID + " = " + id,
null
);
}
}
但正如我在我的應用程序創造越來越多的實體,我覺得不屑於必須鍵入所有這些相同的事情,所以我覺得做一個抽象類Dao
,將有所有的這些操作和班會剛擴展它。
abstract class Dao {
SQLiteOpenHelper helper;
SQLiteDatabase database;
public ArrayList<?> all(String tableName, String[] columns) {
Cursor cursor = database.query(tableName, columns, null, null, null, null, null);
ArrayList<?> entities = new ArrayList<>();
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
// Oh shit.
}
}
return entities;
}
}
現在的問題,例如,在all()
方法是要實例化的模型類,如在實例化CategoryDao.all()
Category
。在抽象類中是否有可能實現類似ArrayList<?>
這樣的類似的東西,它在哪裏傳遞可能是任何類型的東西?
是否可以使用一些ORM,甚至是另一個便於執行的數據庫?我有一些建議。 –
我從來沒有想過使用ORM,實際上並不知道有。但是我真的很想知道我的問題,如果那可能,而且對我來說更多地學習Java。 – mfgabriel92
ORM是對象關係映射。它們是便於將實體作爲對象進行管理的庫。對於Java EE最流行的是Hibernate。 –