安卓数据库框架--ormlite

安卓开发的时候,有时候会用到数据库。这里介绍一个orm框架。

orm是每个类对应一个数据库中的表。对数据库的操作是以Bean为单位来进行的。

1、引入jar包,两种方式

(1)可以直接下载jar包,放在lib目录下

(2)在gradle中配置

dependencies {
    .......    
    // https://mvnrepository.com/artifact/com.j256.ormlite/ormlite-android
    implementation group: 'com.j256.ormlite', name: 'ormlite-android', version: '5.1'
    implementation group: 'com.j256.ormlite', name: 'ormlite-core', version: '5.1'
}

2、创建dbheper、bean、和dao。直接用dao操作数据库

dbhelper

package com.smartisan.muse.sql;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import com.smartisan.muse.utils.LogUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String TAG = "DatabaseHelper";


    public static final String TABLE_NAME = "/ormlite_citys.db";//默认是在data/data/包名/databases/路径下
    //    public static final String DATABASE_PATH = ;//指定路径
    private static final int DB_VERSION = 1;

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

    private DatabaseHelper(Context context) {
        super(context, context.getApplicationInfo().dataDir + TABLE_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database,
                         ConnectionSource connectionSource) {
        try {
            TableUtils.createTableIfNotExists(connectionSource, City.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }



    @Override
    public void onUpgrade(SQLiteDatabase database,
                          ConnectionSource connectionSource, int oldVersion, int newVersion) {
        //整表删除创建
//        try {
//            TableUtils.dropTable(connectionSource, Childs.class, true);
//            TableUtils.dropTable(connectionSource, Courses.class, true);
//            TableUtils.dropTable(connectionSource, Parents.class, true);
//            onCreate(database, connectionSource);
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
        //更新数据库时只需添加新增字段
        if (newVersion == 2) {
            //数据库、表名、列名、类型
//            updateColumn(database, "muse_table_city", "s_phone", "VARCHAR", null);
        }
    }

    private static DatabaseHelper instance;

    /**
     * 单例获取该Helper
     *
     * @param context
     * @return
     */
    public static synchronized DatabaseHelper getHelper(Context context) {
        context = context.getApplicationContext();
        if (instance == null) {
            synchronized (DatabaseHelper.class) {
                if (instance == null)
                    instance = new DatabaseHelper(context);
            }
        }

        return instance;
    }

    public synchronized Dao getHelperDao(Class<City> clazz) throws SQLException {
        Dao dao = null;
        String className = clazz.getSimpleName();

        if (daos.containsKey(className)) {
            dao = daos.get(className);
        }
        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;
        }
    }

    public static void updateColumn(SQLiteDatabase db, String tableName,
                                    String columnName, String columnType, Object defaultField) {
        try {
            if (db != null) {
                Cursor c = db.rawQuery("SELECT * from " + tableName
                        + " limit 1 ", null);
                boolean flag = false;

                if (c != null) {
                    for (int i = 0; i < c.getColumnCount(); i++) {
                        if (columnName.equalsIgnoreCase(c.getColumnName(i))) {
                            flag = true;
                            break;
                        }
                    }
                    if (flag == false) {
                        String sql = "alter table " + tableName + " add "
                                + columnName + " " + columnType + " default "
                                + defaultField;
                        db.execSQL(sql);
                    }
                    c.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void deleteRecordsWithoutForeignKey(SQLiteDatabase db, String tableName) {
        if (db != null) {
            String sql = "DELETE from " + tableName;
            db.execSQL(sql);
        }
    }

}

bean

package com.smartisan.muse.sql;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

//定义表名
@DatabaseTable(tableName = "muse_table_city")
public class City {

    //generatedId定义主键自增长,columnName定义该字段在数据库中的列名
    @DatabaseField(useGetSet = true, generatedId = false, columnName = "id")
    private int id;


    @DatabaseField(useGetSet = true, columnName = "f_town_name")
    private String townName;//城镇名字

    @DatabaseField(useGetSet = true, columnName = "f_city_name")
    private String cityName;//所在地级市名字

    @DatabaseField(useGetSet = true, columnName = "f_province_name")
    private String provinceName;//省的名字

    @DatabaseField(useGetSet = true, columnName = "f_state_name")
    private String stateName;//国家的名字

    @DatabaseField(useGetSet = true, columnName = "f_short_name")
    private String shortName;//拼音缩写

    @DatabaseField(useGetSet = true, columnName = "f_long_name")
    private String longName;//拼音全写

    @DatabaseField(useGetSet = true, columnName = "f_search_time")
    private long time;//拼音全写

    public City() {
    }

    public City(String id, String townName, String cityName, String provinceName, String stateName, String shortName, String longName, long searchTime) {
        this.id = Integer.valueOf(id);
        this.townName = townName;
        this.cityName = cityName;
        this.provinceName = provinceName;
        this.stateName = stateName;
        this.shortName = shortName;
        this.longName = longName;
        this.time = searchTime;
    }

    public City(int id, String townName, String cityName, String provinceName, String stateName, String shortName, String longName, long searchTime) {
        this.id = id;
        this.townName = townName;
        this.cityName = cityName;
        this.provinceName = provinceName;
        this.stateName = stateName;
        this.shortName = shortName;
        this.longName = longName;
        this.time = searchTime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTownName() {
        return townName;
    }

    public void setTownName(String townName) {
        this.townName = townName;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }

    public String getStateName() {
        return stateName;
    }

    public void setStateName(String stateName) {
        this.stateName = stateName;
    }

    public String getShortName() {
        return shortName;
    }

    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    public String getLongName() {
        return longName;
    }

    public void setLongName(String longName) {
        this.longName = longName;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public String getLocationInfo() {
        StringBuffer stringBuffer = new StringBuffer();
        if (!this.townName.equals(this.cityName)) {
            stringBuffer.append(this.cityName + ",");
        }
        if (!stringBuffer.toString().contains(this.provinceName)) {
            stringBuffer.append(this.provinceName + ",");
        }
        if (!stringBuffer.toString().contains(this.stateName)) {
            stringBuffer.append(this.stateName + ",");
        }
        String info = stringBuffer.toString();
        return info.substring(0, info.length() - 1);
    }

    @Override
    public String toString() {
        return "id :" + id + "--" + townName + "," + cityName + "," + provinceName + "," + stateName + "," + time + "," + getLocationInfo();
    }
}

Dao

package com.smartisan.muse.sql;
import android.content.Context;
import android.util.Log;

import com.j256.ormlite.dao.Dao;
import com.smartisan.muse.R;
import com.smartisan.muse.utils.LogUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.smartisan.muse.sql.DatabaseHelper.TABLE_NAME;


public class CityDao {

    private static final String TAG = "CityDao";

    private Dao<City, Integer> childDao;
    private DatabaseHelper helper;

    public CityDao(Context contex) {
        try {
            helper = DatabaseHelper.getHelper(contex);
            childDao = helper.getHelperDao(City.class);
            if (childDao == null) {
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void copyDataBase(Context context) {
        String newPath = context.getApplicationInfo().dataDir + TABLE_NAME;
        File newFile = new File(newPath);
        if (!newFile.exists()) {
            copyFile(context, newPath);
        }
    }


    private void copyFile(Context context, String newPath) {
        try {
            int bytesum = 0;
            int byteread = 0;
//            File oldfile = new File(oldPath);
//            if (oldfile.exists()) { //文件存在时
//                InputStream inStream = new FileInputStream(oldPath); //读入原文件
            InputStream inStream = context.getResources().getAssets().open("ormlite_citys.db"); //读入原文件
            if (inStream != null) {
                FileOutputStream fs = new FileOutputStream(newPath);
                byte[] buffer = new byte[1444];
                int length;
                while ((byteread = inStream.read(buffer)) != -1) {
                    bytesum += byteread; //字节数 文件大小
                    System.out.println(bytesum);
                    fs.write(buffer, 0, byteread);
                }
                inStream.close();
            } else {
                cityCreateDB(context);
            }
        } catch (Exception e) {
            LogUtils.e(TAG, "copy database error!");
            e.printStackTrace();

        }

    }

    public void cityCreateDB(Context context) {
        String[] citys = context.getResources().getStringArray(R.array.city_cn);
        for (String city : citys) {
            String[] cs = city.split(",");
            for (int i = 0; i < cs.length; i++) {
                cs[i] = cs[i].replaceAll("'", "");
            }
            City c = new City(cs[0], cs[1], cs[2], cs[3], cs[4], cs[5], cs[6], 0);
            Log.d(TAG, "cityCreateDB: " + c);
            addCity(c);
        }
        Log.d(TAG, "cityCreateDB finished>>>>>" + getCityCount());
    }

    /**
     * 增
     */
    public void addCity(City city) {
        try {
            childDao.create(city);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删(通过实体)
     */
    public void delChild(City city) {
        try {
            childDao.delete(city);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删(通过id)
     *
     * @param id
     */
    public void delChildById(Integer id) {
        try {
            childDao.deleteById(id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 改
     */
    public void updateChild(City city) {
        try {
            childDao.update(city);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查
     *
     * @return
     */
    public List<City> queryAllChild() {
        ArrayList<City> childs = null;
        try {
            childs = (ArrayList<City>) childDao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return childs;
    }

    /**
     * 获取user
     */
    public City getChild(Integer id) {
        try {
            return childDao.queryForId(id);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    public int getCityCount() {
        try {
            return childDao.queryForAll().size();
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }


    /**
     * 查询citys
     */
    public List<City> searchCityByName(String name) {
        try {
            List<City> cities = childDao.queryBuilder().where()
                    .like("f_town_name", name)
                    .or().like("f_city_name", name)
                    .or().like("m_province_name", name)
                    .or().like("m_state_name", name)
                    .query();
            return cities;
        } catch (SQLException e) {
            e.printStackTrace();
            return new ArrayList<City>();
        }
    }

    /**
     * 添加历史查询数据
     */

    public void setHistoryCity(City city) {
        long time = new Date().getTime();
        city.setTime(time);
        try {
            childDao.update(city);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除查询历史
     */
    private void delHistoryCity(City city) {
        city.setTime(0);
        try {
            childDao.update(city);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private int maxHistoryNum = 10;

    /**
     * 获取历史查询数据
     */
    public List<City> getHistoryCitys() {
        try {
            List<City> cities = childDao.queryBuilder()
                    .orderBy("f_search_time", false)
                    .where()
                    .ne("f_search_time", 0)
                    .query();
            if (cities.size() > maxHistoryNum) {
                for (int i = maxHistoryNum; i < cities.size(); i++) {
                    delHistoryCity(cities.get(i));
                }
                cities = cities.subList(0, maxHistoryNum);
            }
            return cities;
        } catch (SQLException e) {
            e.printStackTrace();
            return new ArrayList<City>();
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值