sqlite简单封装

来源:互联网 发布:2016新开淘宝运营教程 编辑:程序博客网 时间:2024/06/05 03:41

作者:今天来跟大家说一个sqlite的简单封装,首先说一下通常情况下我们是怎样写自己的Sqlite,这里写出来是为了加深一下大家的印象,同时也是回顾一下,为那些不清楚Sqlite的同学打个基础;


Sqlite api调用

0.Dphelper
public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "demo.db";//数据库名称
    private static final int DB_VERSION = 1;//数据库版本号,这里升级数据库的时候会用到

    public static final String TABLE_BOOK = "table_book";//表名
//表字段名
    public static final String TABLE_BOOK_ID = "_id";//主键id
    public static final String TABLE_BOOK_NAME = "name";//书本名字字段
    public static final String TABLE_BOOK_AUTHOR = "author";//书本作者字段

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_BOOK + " ("
                + TABLE_BOOK_ID + " varchar(50)"
                + TABLE_BOOK_NAME + " varchar(50)"
                + TABLE_BOOK_AUTHOR + " varchar(50))");//建表
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

1.实体类
2.定义接口
3.实现类
public class Book {
    public String id;
    public String name;
    public String author;
}
 
public interface BookDao {
    long insert(Book book);
    int delete(String id);
    int update(Book book);
    List<Book> findAll();
}
 
public class BookDaoImpl implements BookDao{

    private final SQLiteDatabase db;

    public BookDaoImpl(Context context) {
        DBHelper dbHelper = new DBHelper(context);
        db = dbHelper.getWritableDatabase();
}

    @Override
    public long insert(Book book) {
        ContentValues values = new ContentValues();
        values.put(DBHelper.TABLE_BOOK_ID,book.id);
        values.put(DBHelper.TABLE_BOOK_NAME,book.name);
        values.put(DBHelper.TABLE_BOOK_AUTHOR,book.author);
        return db.insert(DBHelper.TABLE_BOOK,null,values);
    }

    @Override
    public int delete(String id) {
        return db.delete(DBHelper.TABLE_BOOK,DBHelper.TABLE_BOOK_ID+"=?",new String[]{id});
    }

    @Override
    public int update(Book book) {
        ContentValues values = new ContentValues();
        values.put(DBHelper.TABLE_BOOK_ID,book.id);
        values.put(DBHelper.TABLE_BOOK_NAME,book.name);
        values.put(DBHelper.TABLE_BOOK_AUTHOR,book.author);
        return db.update(DBHelper.TABLE_BOOK,values,DBHelper.TABLE_BOOK_ID+"=?",new String[]{book.id});
    }

    @Override
    public List<Book> findAll() {
        Cursor cursor = db.query(DBHelper.TABLE_BOOK, null, null, null, null, null, null);
        List<Book> books = null;
        if(cursor!=null){
            books = new ArrayList<>();
            while (cursor.moveToNext()){
                int columnIndex = cursor.getColumnIndex(DBHelper.TABLE_BOOK_NAME);
                String columnContent = cursor.getColumnName(columnIndex);
                Book book = new Book();
                book.name = columnContent;
                books.add(book);
            }
        }
        cursor.close();
        return books;
    }
}
 
作者:不同业务都写接口,写实现类,费劲,如何偷懒?通用操作封装,屏蔽业务差别。差别在哪?
Sqlite-->增删改查。1.定义接口 2.抽取基类,实现通用操作 3.屏蔽bean对象区别
1..定义接口
public interface Dao<M> {
     long insert(M m);
     int delete(String id);
     int update(M m);
     List<M> findAll();
}
 2.抽取基类,实现通用操作
public class BaseDao<M> implements Dao<M> {

    private final SQLiteDatabase db;
    private String primaryKey;

    public BaseDao(Context context) {
        DBHelper dbHelper = new DBHelper(context);
        db = dbHelper.getWritableDatabase();
    }

    @Override
    public long insert(M m) {
        ContentValues values = fillColumns(m);
        return db.insert(getTableName(), null, values);
    }


    @Override
    public int delete(String id) {
        return db.delete(getTableName(), getPrimaryKey() + "=?", new String[]{id});
    }

    @Override
    public int update(M m) {
        ContentValues values = fillColumns(m);
        return db.update(getTableName(), values, getPrimaryKey() + "=?", new String[]{getPrimaryValue(m)});
    }


    @Override
    public List<M> findAll() {
        Cursor cursor = db.query(getTableName(), null, null, null, null, null, null);
        List<M> list = null;
        if (cursor != null) {
            list = new ArrayList<>();
            while (cursor.moveToNext()) {
                M m = fillBean(cursor);
                list.add(m);
            }
        }
        cursor.close();
        return list;
    }


    /**
     * 根据实例对象获取表名
     *
     * @return
     */
    public String getTableName() {
        M m = getBean();
        Table_Name annotation = m.getClass().getAnnotation(Table_Name.class);
        if (annotation != null) {
            return annotation.value();
        }
        return m.getClass().getSimpleName();
    }

    public String getPrimaryKey() {
        M m = getBean();
        Field[] declaredFields = m.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            Table_Column annotation = field.getAnnotation(Table_Column.class);
            if (annotation != null) {
                boolean primarykey = annotation.primarykey();
                if (primarykey) {
                    return annotation.value();
                }
            }
        }
        return "";
    }

    private String getPrimaryValue(M m) {
        Field[] declaredFields = m.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            Table_Column annotation = field.getAnnotation(Table_Column.class);
            if (annotation != null) {
                boolean primarykey = annotation.primarykey();
                if (primarykey) {
                    try {
                        return field.get(m).toString();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return "";
    }

    /**
     * 将实例对象属性 对应到列,并对应赋值
     *
     * @param m
     * @return
     */
    private ContentValues fillColumns(M m) {
        ContentValues values = new ContentValues();
        Field[] declaredFields = m.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            Table_Column annotation = field.getAnnotation(Table_Column.class);
            if (annotation != null) {
                String columnKey = annotation.value();
                try {
                    String columnValue = field.get(m).toString();
                    values.put(columnKey, columnValue);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return values;
    }

    private M fillBean(Cursor cursor) {
        M m = getBean();
        Field[] declaredFields = m.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            Table_Column annotation = field.getAnnotation(Table_Column.class);
            if (annotation != null) {
                String columnKey = annotation.value();
                int columnIndex = cursor.getColumnIndex(columnKey);
                String columnContent = cursor.getColumnName(columnIndex);
                try {
                    field.set(m, columnContent);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
//        int columnIndex = cursor.getColumnIndex(DBHelper.TABLE_BOOK_NAME);
//        String columnContent = cursor.getColumnName(columnIndex);
//        M bean = getBean();
//        bean.name = columnContent;
        return m;
    }

    /**
     * 根据泛型创建一个实例对象
     *
     * @return
     */
    private M getBean() {
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        if (genericSuperclass != null && genericSuperclass instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
            try {
                return (M) ((Class) actualTypeArguments[0]).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


}

需借助注解、反射
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table_Name {
    String value();
}
 
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table_Column {
    String value();
    boolean primarykey() default false;
}
 
@Table_Name(DBHelper.TABLE_BOOK)
public class Book {
    @Table_Column(value = DBHelper.TABLE_BOOK_ID,primarykey = true)
    public String id;
    @Table_Column(DBHelper.TABLE_BOOK_NAME)
    public String name;
    @Table_Column(DBHelper.TABLE_BOOK_AUTHOR)
    public String author;
}

作者:这个封装是用到了反射,这样做减少了代码量,不用说出现一个实体就要创建一个数据的管理类,如果你有更好的方法也可以分享给我哦

0 0
原创粉丝点击