天天看點

ORMLite架構 的使用方法---給你的資料庫操作插上翅膀

一:首先下載下傳 ORMLite Jar 包

先去 ORMLite官網下載下傳jar包 寫部落格時,目前最新的,對于Android為:ormlite-android-5.0.jar 和 ormlite-core-5.0.jar ; 

然後分包處理,建議如圖所示分包:

ORMLite架構 的使用方法---給你的資料庫操作插上翅膀
二:配置Bean類
@DatabaseTable(tableName = "Book")
public class MyBean {


    @DatabaseField(generatedId = true)

    private int id;


    @DatabaseField(columnName = "name")

    public String name;


    @DatabaseField(columnName = "author")

    public String author;


    @DatabaseField(columnName = "price")

    public String price;


    @DatabaseField(columnName = "pages")

    public int pages;



    public String getAuthor() {

        return author;

    }


    public void setAuthor(String author) {

        this.author = author;

    }


    public String getPrice() {

        return price;

    }


    public void setPrice(String price) {

        this.price = price;

    }


    public int getPages() {

        return pages;

    }


    public void setPages(int pages) {

        this.pages = pages;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }

}
           
三:編寫Helper類
public class MyDatabaseHelper extends OrmLiteSqliteOpenHelper {


    public static final String DB_NAME = "BookStore.db";

    public static final int DB_VERSION = 1;



    public MyDatabaseHelper(Context context) {

        super(context, DB_NAME, null, DB_VERSION);

    }



    @Override

    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {

        try {

            TableUtils.createTable(connectionSource, MyBean.class);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    @Override

    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {

        System.out.println("MyDatabaseHelper.onUpgrade oldVersion=" + oldVersion + "  newVersion=" + newVersion);

        try {


            switch (oldVersion) {

                case 1:

                    getDao(MyBean.class).executeRaw("alter table Book add column book_type varchar(20)");

                    //在資料庫版本1的下一版本,Book表中新添加了 book_type 字段


                case 2:

                   // TableUtils.createTable(connectionSource, MyBean2.class);

                   //在資料庫版本2的下一版本,新增加了一張表

                default:

                    break;

            }



            //顯然這樣處理比較暴力

            //TableUtils.dropTable(connectionSource, MyBean.class, true);

            //onCreate(sqLiteDatabase, connectionSource);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    private static MyDatabaseHelper instance;


    /**

     * 單例擷取該Helper

     *

     * @param context

     * @return

     */

    public static MyDatabaseHelper getHelper(Context context) {

        if (instance == null) {

            synchronized (MyDatabaseHelper.class) {

                if (instance == null)

                    instance = new MyDatabaseHelper(context);

            }

        }

        return instance;

    }



    private Map<String, Dao> daos = new HashMap<>();


    public synchronized Dao getDao(Class clazz) throws SQLException {

        Dao dao = null;

        String className = clazz.getSimpleName();

        if (daos.containsKey(className)) {

            dao = daos.get(clazz);

        }

        if (dao == null) {

            dao = super.getDao(clazz);

            daos.put(className, dao);

        }

        return dao;

    }



    @Override

    public void close() {

        super.close();

        for (String key : daos.keySet()) {

            Dao dao = daos.get(key);

            dao = null;

        }

    }



}
           
四:編寫DAO類
1:接口編寫:
public interface MyDataImpl {


    void insert(ArrayList<MyBean> beanArrayList);


    void insert(MyBean myBean);


    void update(String name, String price);


    void update2(String columnName, String columnValue);


    void update3(String queryColumnName, String queryColumnValue, String setColumnName, String setColumnValue);



    void delete(String name);


    int deleteAll();



    ArrayList<String> queryPrice(String name);


    String queryAuthor(String name, String price);


    long queryCount();


    ArrayList<MyBean> queryId(int id);


    ArrayList<MyBean> queryAll();



}
           
public class MyDataDao implements MyDataImpl {

    private MyDatabaseHelper mHelper;

    private Dao<MyBean, Integer> dao;

    private Context mContext;

    private static MyDataDao instance;


    protected MyDataDao(Context context) {

        this.mContext = context;

        try {

            mHelper = MyDatabaseHelper.getHelper(mContext);

            dao = mHelper.getDao(MyBean.class);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }



    public static MyDataDao getInstance(Context context) {

        if (instance == null) {

            synchronized (MyDataDao.class) {

                if (instance == null) {

                    instance = new MyDataDao(context);

                }

            }


        }

        return instance;

    }



    @Override

    public void insert(MyBean myBean) {



        try {


            //事務操作

           /* TransactionManager.callInTransaction(mHelper.getConnectionSource(), new Callable<Void>() {

                @Override

                public Void call() throws Exception {

                    return null;

                }

            });*/



            dao.create(myBean);

            //dao.createOrUpdate(myBean);//和上一行的方法效果一樣

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }



    @Override

    public void insert(ArrayList<MyBean> beanArrayList) {

        try {

            dao.create(beanArrayList);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    @Override

    public void update(String name, String price) {

        ArrayList<MyBean> list = null;

        try {

            list = (ArrayList<MyBean>) dao.queryForEq("name", name);

            if (list != null) {

                for (MyBean bean : list) {

                    bean.setPrice(price);

                    dao.update(bean);

                    //dao.createOrUpdate(bean);//和上一行的方法效果一樣

                }


            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    @Override

    public void update2(String columnName, String columnValue) {

        try {

            //下面這兩個代碼的意思一樣

            dao.updateBuilder().updateColumnValue(columnName, columnValue).update();

            //dao.updateRaw("update Book set " + columnName + "=?", new String[]{columnValue});

        } catch (SQLException e) {

            e.printStackTrace();

        }



    }


    @Override

    public void update3(String queryColumnName, String queryColumnValue, String setColumnName, String setColumnValue) {

        try {

            String sql = "update Book set " + setColumnName + "= '" + setColumnValue + "' where " + queryColumnName + "= '" + queryColumnValue + "'";

            System.out.println("MyDataDao.update3 sql=" + sql);

            dao.updateRaw(sql);


            //dao.updateRaw("update Book set price= '33333元' where name= '西遊記'");//等價于上面的寫法

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    @Override

    public void delete(String name) {

        ArrayList<MyBean> list = null;

        try {

            list = (ArrayList<MyBean>) dao.queryForEq("name", name);

            if (list != null) {

                for (MyBean bean : list) {

                    dao.delete(bean);

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }


    /**

     * @return -1:删除資料異常  0:無資料

     */

    @Override

    public int deleteAll() {

        int number = -1;

        try {

            number = dao.deleteBuilder().delete();//傳回删除的資料條數  例如:删除1條資料,傳回1,依次類推。


            //dao.deleteBuilder().where().eq("name", "記").reset();//????

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return number;

    }


    @Override

    public ArrayList<String> queryPrice(String name) {

        List<MyBean> list = null;

        ArrayList<String> strings = null;

        try {

            list = dao.queryForEq("name", name);

            if (list != null) {

                strings = new ArrayList<>();

                for (MyBean myBean : list) {

                    strings.add(myBean.getPrice());

                }

                /*for (int i = 0; i < list.size(); i++) {

                    strings.add(list.get(i).getPrice());

                }*/

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return strings;

    }


    @Override

    public String queryAuthor(String name1, String price1) {

        List<MyBean> list = null;

        String author = "";


        try {

            list = dao.queryBuilder().where().eq("name", name1).and().eq("price", price1).query();//上述相當與:select * from Book where name = name1 and price = price1 ;

            if (list != null) {

                for (MyBean myBean : list) {

                    author = myBean.getAuthor();

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }


        return author;//說明:如果這個 author 是唯一的,可以這樣的傳回。如果是多個的話,要傳回一個ArrayList<String> 類型

    }


    /**

     * @return 表中資料的個數

     */

    @Override

    public long queryCount() {

        long number = 0;

        try {

            number = dao.queryBuilder().countOf();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return number;

    }


    /**

     * @param id 這個id 就是表中,每次插入資料,自己遞增的id 字段

     */

    @Override

    public ArrayList<MyBean> queryId(int id) {

        ArrayList<MyBean> list = null;


        try {

            MyBean myBean = dao.queryForId(id);

            if (myBean != null) {

                list = new ArrayList<>();

                list.add(myBean);

            }

            return list;

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return list;

    }


    @Override

    public ArrayList<MyBean> queryAll() {

        ArrayList<MyBean> list = null;

        try {

            list = (ArrayList<MyBean>) dao.queryForAll();



            if (list != null) {

                return list;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return list;

    }



    public boolean delteTables(Context context, String DBname) {

        //?????

        return false;

    }



    /**

     * 這個方法可以的

     */

    public boolean delteDatabases(Context context, String DBname) {

        return context.deleteDatabase(DBname);

    }



}
           
五:測試
源碼下載下傳位址
參考文章:
 ● Android快速開發–使用ORMLite操作資料庫
 ●  鴻洋的部落格:
 ●  Android ORMLite 架構的入門用法
 ●  Android 快速開發系列 ORMLite 架構最佳實踐
 ●  SQL 文法
 ●  SQL UPDATE 語句
 ●  OrmLite 官網

原文釋出時間為:2018-10-5

本文來自雲栖社群合作夥伴“

Android開發中文站

”,了解相關資訊可以關注“

”。