簡易ORM Sqliteフレームワーク一記憶

14336 ワード

最近、会社のプロジェクトはデータベースに操作する必要があるので、realmデータベースを採用するつもりだったが、考えてみると怠け者で、そんなに統合しなければならないので、sqliteデータベースを採用した.結局何度も使ったことがあるが、最初は書くのが面倒だと思っていた.それからこれからはすべてのプロジェクトを直接使って、言うとすぐにやることができます.
スレ主は最近楽屋を学んでいるので、楽屋のフレームに触れることができて、とても便利だと思って、1つのモデルを投げて、表に写すことができて、そこでこれらのフレームのやり方を見て、最後に注釈+反射を採用して書いて、反射性能は悪いですが、たまに使うことができます.
解決手順
  • modelはContentValue
  • にマッピングされる
  • ContentValue挿入データベース
  • クエリーcursorテーブルmodel
  • にマッピング
    分解するにはこの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