簡易ORM Sqliteフレームワーク一記憶
最近、会社のプロジェクトはデータベースに操作する必要があるので、realmデータベースを採用するつもりだったが、考えてみると怠け者で、そんなに統合しなければならないので、sqliteデータベースを採用した.結局何度も使ったことがあるが、最初は書くのが面倒だと思っていた.それからこれからはすべてのプロジェクトを直接使って、言うとすぐにやることができます.
スレ主は最近楽屋を学んでいるので、楽屋のフレームに触れることができて、とても便利だと思って、1つのモデルを投げて、表に写すことができて、そこでこれらのフレームのやり方を見て、最後に注釈+反射を採用して書いて、反射性能は悪いですが、たまに使うことができます.
解決手順 modelはContentValue にマッピングされる ContentValue挿入データベース クエリーcursorテーブルmodel にマッピング
分解するにはこの3つのステップしかないような気がしますが、ここでは注釈をテーブルにマッピングすることは考えていません.今は単純なアクセスデータにすぎません.
手順1:
例えばUserというモデルがあります
UserインスタンスをContentValuesに変換して、データベースに格納し、Userインスタンスの各プロパティ値を取得するために反射を使用する必要があります.
コールバックValueTypeInterfaceの主な役割は、Objectオブジェクトを特定のタイプのオブジェクトに変換することです.このステップに進むと、UserのインスタンスはContentValueオブジェクトにマッピングできます.このオブジェクトは直接データベースに挿入できます.databaseデータベースの操作方法を書きます.データベースの操作方法は何ですか.ただし、データベースの開く、閉じる、削除して調べる.
データベースの操作は定義されています.具体的には、insertの操作コードは次のようになります.
そしてDaoごとに共通のRootDaoを作成します
各Daoの操作の共通の操作は私達が定義して、今私達はUserDaoを編纂してUserを専門に操作します
そして我々のUserDaoを実現し、その中のsave操作は
例は比較的に勝手で、しかしやはり体現することができて、USERTABLEは私達の表名で、実はこの一歩に着いて、私達はすでにmodelが反射してデータベースの中に保存することを実現して、方式を呼び出します
ここで私たちはストレージを実現して、主にバックグラウンドのいくつかの知識を吸収して、彼の山の石は玉を攻めることができて、多く優秀なソースコードを読んで、成長するのがもっと速いことができます.ソースコードはgithub githubアドレスをアップロードしました:https://github.com/jredthree/DBTest
スレ主は最近楽屋を学んでいるので、楽屋のフレームに触れることができて、とても便利だと思って、1つのモデルを投げて、表に写すことができて、そこでこれらのフレームのやり方を見て、最後に注釈+反射を採用して書いて、反射性能は悪いですが、たまに使うことができます.
解決手順
分解するにはこの3つのステップしかないような気がしますが、ここでは注釈をテーブルにマッピングすることは考えていません.今は単純なアクセスデータにすぎません.
手順1:
例えばUserというモデルがあります
/**
* author: smart
* time: 2016/12/14
*/
public class User implements Serializable {
private int id;
private String name;
private int old;
private boolean sex;
private float number;
private double price;
private long count;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public float getNumber() {
return number;
}
public void setNumber(float number) {
this.number = number;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", old=" + old +
", sex=" + sex +
", number=" + number +
", price=" + price +
", count=" + count +
'}';
}
}
UserインスタンスをContentValuesに変換して、データベースに格納し、Userインスタンスの各プロパティ値を取得するために反射を使用する必要があります.
/**
* ContentValues
* @param object
* @return
*/
public ContentValues getContentValues(Object object){
final ContentValues cv = new ContentValues();
Class c = object.getClass();
Field[] fields = c.getDeclaredFields();
Method[] methods = c.getDeclaredMethods();
for(Field field : fields) {
final String fieldName = field.getName();
String typeName = field.getType().getSimpleName();
String getMethodName;
if (typeName.equalsIgnoreCase("boolean")) {
getMethodName = "is" + fieldName;
} else {
getMethodName = "get" + fieldName;
}
// get
Method method = getMethod(getMethodName, methods);
//
if (null != method) {
String className = method.getReturnType().getSimpleName();
try {
Object o = method.invoke(object);
getResult(className, o, new ValueTypeInterface() {
@Override
public void getValue(Integer result) {
cv.put(fieldName, result);
}
@Override
public void getValue(Boolean result) {
cv.put(fieldName, result);
}
@Override
public void getValue(Float result) {
cv.put(fieldName, result);
}
@Override
public void getValue(Double result) {
cv.put(fieldName, result);
}
@Override
public void getValue(Long result) {
cv.put(fieldName, result);
}
@Override
public void getValue(String result) {
cv.put(fieldName, result);
}
@Override
public void getValue(Byte result) {
cv.put(fieldName, result);
}
});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
return cv;
}
コールバックValueTypeInterfaceの主な役割は、Objectオブジェクトを特定のタイプのオブジェクトに変換することです.このステップに進むと、UserのインスタンスはContentValueオブジェクトにマッピングできます.このオブジェクトは直接データベースに挿入できます.databaseデータベースの操作方法を書きます.データベースの操作方法は何ですか.ただし、データベースの開く、閉じる、削除して調べる.
/**
* author: smart
* time: 2016/12/15
*/
public interface DBAction {
void open(String dbName,String[] createTable,String[] updateTavleName,int version);
void close();
long insert(String tableName,T t);
long delete(String tableName, String[] whereClause, String[] whereArgs);
long update(String tableNamele, T t, String[] whereClause, String[] whereArgs);
List query(String tableNamele, String[] selection, String[] selectionArgs ,String orderBy,Class classZ);
}
データベースの操作は定義されています.具体的には、insertの操作コードは次のようになります.
@Override
public long insert(String tableName, T t) {
ContentValues cv = new ContentValues();
cv = dbUtils.getContentValues(t);
return db.insert(tableName,null,cv);
}
そしてDaoごとに共通のRootDaoを作成します
/**
* author: smart
* time: 2016/12/15
*/
interface RootDao<T, PK extends Serializable> {
T get(PK id);
List findAll();
PK save(T entity);
void update(T entity);
void delete(PK id);
}
各Daoの操作の共通の操作は私達が定義して、今私達はUserDaoを編纂してUserを専門に操作します
/**
* author: smart
* time: 2016/12/15
*/
public interface UserDao extends RootDao<User,String> {
}
そして我々のUserDaoを実現し、その中のsave操作は
@Override
public String save(User entity) {
daoHelp.open();
Long a = daoHelp.getDao().insert(USERTABLE,entity);
daoHelp.close();
return String.valueOf(a);
}
例は比較的に勝手で、しかしやはり体現することができて、USERTABLEは私達の表名で、実はこの一歩に着いて、私達はすでにmodelが反射してデータベースの中に保存することを実現して、方式を呼び出します
findViewById(R.id.btnInsert).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
User user = new User();
user.setName("jredthree");
user.setOld(13);
user.setSex(true);
user.setNumber(123);
user.setPrice(333.4);
user.setCount(100000);
dao.save(user);
}
}
);
ここで私たちはストレージを実現して、主にバックグラウンドのいくつかの知識を吸収して、彼の山の石は玉を攻めることができて、多く優秀なソースコードを読んで、成長するのがもっと速いことができます.ソースコードはgithub githubアドレスをアップロードしました:https://github.com/jredthree/DBTest