安卓数据库封装

不妥之处希望给予纠正,学习中


首先写一个数据库的增删改查的抽象类,五个抽象方法,我只使用了一个User表,所以只有一个获取User表的方法,代码如下

package com.example.a21150.projectutils;

import android.content.Context;

import java.sql.SQLException;
import java.util.List;

/**
 * Created by 21150 on 2016/11/8.
 */
public abstract class DataBaseUtils<T> {

    private static DataBaseUtils mUserDataBaseUtils;

    public abstract void insert(T clzz) throws SQLException;

    public abstract void insert(List<T> list) throws SQLException;

    public abstract void delete(T clzz) throws SQLException;

    public abstract void update(T clzz) throws SQLException;

    public abstract List<T> queryForAll() throws SQLException;

    public abstract List<T> query(T clzz) throws SQLException;

    /**
     * 获取user表的Dao
     * @param context
     * @return
     */
    public static DataBaseUtils getUserDabaUtils(Context context) {

        if (mUserDataBaseUtils == null) {
            synchronized (DataBaseUtils.class) {
                mUserDataBaseUtils = UserDao.getDao(context);
            }
        }
        return mUserDataBaseUtils;
    }
}

下面是User表的Dao类,继承DataBaseUtils类,实现抽象方法,代码如下

package com.example.a21150.projectutils;

import android.content.Context;

import com.j256.ormlite.dao.Dao;

import java.sql.SQLException;
import java.util.List;

/**
 * Created by 21150 on 2016/11/8.
 */
public class UserDao extends DataBaseUtils<User> {

    //User表dao
    private Dao<User,Integer> mUserDao;

    private static UserDao mOrmLiteDataBase;

    private UserDao(Context context){
        try {
            mUserDao = (Dao<User, Integer>) OrmLiteHelper.getInstance(context).getDao(User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static UserDao getDao(Context context){

        if (mOrmLiteDataBase == null){
            synchronized (UserDao.class){
                mOrmLiteDataBase = new UserDao(context);
            }
        }
        return mOrmLiteDataBase;
    }

    @Override
    public void insert(User clzz) throws SQLException {
        mUserDao.create(clzz);
    }

    @Override
    public void insert(List<User> list) throws SQLException {
        mUserDao.create(list);
    }

    @Override
    public void delete(User clzz) throws SQLException {
        mUserDao.delete(clzz);
    }

    @Override
    public void update(User clzz) throws SQLException {
            mUserDao.update(clzz);
    }

    @Override
    public List<User> queryForAll() throws SQLException {
        return mUserDao.queryForAll();
    }

    @Override
    public List<User> query(User clzz) throws SQLException {
        List<User> name = mUserDao.queryBuilder().where().eq("name", clzz.getName()).query();
        return name;
    }
}

下面时数据库的框架类,我这里用的是ormlite,android studio 导包
compile 'com.j256.ormlite:ormlite-android:5.0'

代码如下

package com.example.a21150.projectutils;

import android.content.Context;
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 java.sql.SQLException;

/**
 * Created by 21150 on 2016/11/7.
 */
public class OrmLiteHelper extends OrmLiteSqliteOpenHelper{

    private static String dataBaseName = "mydata.db";
    private static int version = 1;

    private Dao<User,Integer> mUserDao;

    private static OrmLiteHelper mOrmLiteHelper;

    public OrmLiteHelper(Context context) {
        super(context, dataBaseName, null, version);
    }

    /**
     * 创建数据库,每次初始化的时候调用
     * @param database
     * @param connectionSource
     */
    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {

        try {
            TableUtils.createTable(connectionSource,User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新数据库
     * @param database  原生SQLiteDatabase,可以执行sql语句
     * @param connectionSource 链接数据库资源
     * @param oldVersion 旧版本号
     * @param newVersion 新版本号
     */
    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            TableUtils.dropTable(connectionSource,User.class,true);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 单例获取数据库
     * @param context
     * @return
     */
    public static synchronized OrmLiteHelper  getInstance(Context context){
        if(mOrmLiteHelper == null){
            synchronized (OrmLiteHelper.class){
                mOrmLiteHelper = new OrmLiteHelper(context);
            }
        }
        return mOrmLiteHelper;
    }

    /**
     * 获取单例的dao
     * @return
     */
    private Dao<User,Integer> getUserDao(){
        if (mUserDao == null){
            synchronized (OrmLiteHelper.class){
                try {
                    mUserDao = mOrmLiteHelper.getDao(User.class);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return mUserDao;
    }
}

在activity中使用

package com.example.a21150.projectutils;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.sql.SQLException;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private DataBaseUtils<User> mDataBaseUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDataBaseUtils = DataBaseUtils.getUserDabaUtils(this);

        try {
            List<User> song = mDataBaseUtils.query(new User("dddd", 15));
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

User类如下

package com.example.a21150.projectutils;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

/**
 * Created by 21150 on 2016/11/7.
 */

@DatabaseTable(tableName = "user")
public class User {
    @DatabaseField(columnName = "id", generatedId = true)
    private int id;
    @DatabaseField(columnName = "name")
    private String name;
    @DatabaseField(columnName = "age")
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User(){}
}

加入更换数据库框架时。只需要更改更改DataBaseUtils的实现类即可






一个简单的基于Android的Sqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值