Android 使用SQLite数据库

目录

前言:

创建数据库

增加数据

删除数据

修改数据

查询数据

完整代码


前言:

Android 提供了 SQLiteOpenHelper 接口用作使用SQLite 数据库,提供的方法已经可以非常方便且简洁的使用增删改查操作,但是在调用的时候需要设置很多变量。所以我写了一个更加简洁,可以直接将类传入的保存的工具类.

这个工具类使用起来非常简洁,我将int类与long 类识别出来存储,其他的类型全部都用字符串类型。如果不想还原为类对象,或许使用Json解析的工具包

FastJSON 或者Gson

效果会更好

创建数据库 这个推荐在onCreate方法内使用

这里需要使用存放数据的类。

DBItem.java

public class DBItem {
    public int id = -1;

    public String name;

    public String drive;


    @Override
    public boolean equals(Object obj) {
        return obj instanceof DBItem && ((DBItem) obj).id == id;
    }

    @Override
    public String toString()  {
        return "{id: "+id+", name: "+name+", drive: "+drive+" }";
    }
}

创建数据库

DBOpenHelper dbOpenHelper = DBOpenHelper.createDBHelper(
                context,
                "数据库名",
                DBOpenHelper.DBTable.asDBTable(DBItem.class),
                1);

增加数据

dbOpenHelper.add(new DBItem());

删除数据

// 根据对象删除
dbOpenHelper.remove(new DBItem());

//根据ID 删除
dbOpenHelper.remove(id);

修改数据

// 直接修改内容 这个会识别内部的 id 根据ID更新
dbOpenHelper.set(new DBItem());

// 手动更新内容
dbOpenHelper.set(int id,ContentValues values);

查询数据

// 获取全部的数据
List<DBItem> dbItems = dbOpenHelper.getAll(DBItem.class);

//根据ID查询到存入的类

DBItem dbItems = dbOpenHelper.get(id,DBItem.class);

完整代码

DBOpenHelper.java
public class DBOpenHelper extends SQLiteOpenHelper {

    private SQLiteDatabase database;

    private static String NAME = "drive";

    private static String TAG = NAME+"DB";

    private static String TABLE = NAME;

    private static String DB_FILE = NAME+".db";

    private static DBTable tables;

    private Context context;

    private DBOpenHelper(Context context,
                        String name,
                        SQLiteDatabase.CursorFactory factory,
                        int version) {
        super(context, name, factory, version);
        database = getWritableDatabase();
        this.context = context;

    }

    //id integer primary key autoincrement,step integer,time varchar(20)
    @Override
    public void onCreate(SQLiteDatabase db) {
       String sql = "create table "+TABLE+"("+tables.asSql()+")";

        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
    /**
     * 增加数据
     * */
    public <T> DBOpenHelper add(T values){
        if(database != null){
            ContentValues contentValues = new ContentValues();
            Class c = values.getClass();
            for(Field field: c.getFields()){
                try {
                    if(field.getType() == int.class || field.getType() == long.class){
                        if(field.getName().equalsIgnoreCase("id")){
                            continue;
                        }
                        if(field.getType() == int.class ){
                            contentValues.put(field.getName(),field.getInt(values));
                        }else{
                            contentValues.put(field.getName(),field.getLong(values));
                        }
                    }else{
                        contentValues.put(field.getName(),field.get(values).toString());
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            database.insert(TABLE,null,contentValues);
        }else{
            Log.e(TAG,"数据库不存在");
        }
        return this;
    }

    /**
     * 增加数据
     * */
    public DBOpenHelper add(ContentValues values){
        if(database != null){
            database.insert(TABLE,null,values);
        }else{
            Log.e(TAG,"数据库不存在");
        }
        return this;
    }

    /**
     * 删除数据
     * */
    public DBOpenHelper remove(int id){
        if(database != null) {
            database.delete(TABLE, "id=?", new String[]{id + ""});
        }else{
            Log.e(TAG,"数据库不存在");
        }

        return this;
    }

    /**
     * 删除数据
     * */
    public DBOpenHelper remove(Object id){
        try{
            if(id.getClass().getField("id") != null){
                return remove(id.getClass().getField("id").getInt(id));
            }
        }catch (Exception e){
           throw new NullPointerException("传入的类必须要有 id");
        }
        return this;

    }

    public <T> DBOpenHelper set(T values){
        ContentValues contentValues = new ContentValues();
        Class c = values.getClass();
        int id = -1;
        for(Field field: c.getFields()){
            try {
                if(field.getType() == int.class || field.getType() == long.class){
                    if(field.getName().equalsIgnoreCase("id")){
                        id = field.getInt(values);
                        continue;
                    }
                    if(field.getType() == int.class ){
                        contentValues.put(field.getName(),field.getInt(values));
                    }else{
                        contentValues.put(field.getName(),field.getLong(values));
                    }
                }else{
                    contentValues.put(field.getName(),field.get(values).toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        if(id == -1){
            throw new NullPointerException("无 id 信息");
        }
        return  set(id,contentValues);
    }

    /**
     * 更新数据
     * */
    public DBOpenHelper set(int id,ContentValues values){
        if(database != null) {
            database.update(TABLE, values, "id=?", new String[]{id + ""});
        }else {
            Log.e(TAG,"数据库不存在");
        }

        return this;
    }

    public <T> T get(int id, Class<T> a){
        T t = null;
        try (Cursor cursor = database.query(TABLE, null, "id=?",
                new String[]{id + ""}, null, null, null)) {
            t = a.newInstance();
            Class tc = t.getClass();
            t = explainClass(cursor,tc,t);
        } catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }
        return t;

    }

    public <T> LinkedList<T> getAll(Class<T> a){
        LinkedList<T> datas = new LinkedList<>();
        Cursor cursor = database.query(TABLE, null, null,
                null, null, null,null);
        while (cursor.moveToNext()){
            T t;
            try {
                t = a.newInstance();
                Class tc = t.getClass();
                t = explainClass(cursor,tc,t);
                datas.add(t);
            } catch (IllegalAccessException | InstantiationException e) {
                e.printStackTrace();
            }

        }
        cursor.close();
        return datas;
    }

    public static class DBTable {
        LinkedHashMap<String,String> tables = new LinkedHashMap<>();

        public DBTable(String key,String value){
            tables.put(key, value);
        }

        public DBTable(Map<String,String> m){
            System.out.println(m);
            tables.putAll(m);
        }

        public DBTable put(String key,String value){
            tables.put(key, value);
            return this;
        }

        public String asSql(){
            StringBuilder s = new StringBuilder();
            for (Map.Entry<String,String> e:tables.entrySet()) {
                s.append(e.getKey()).append(" ").append(e.getValue()).append(",");
            }
            return s.toString().substring(0,s.length() - 1);

        }

        public static DBTable asDBTable(Class t){
            Field[] fields = t.getFields();
            LinkedHashMap<String,String> stringStringLinkedHashMap = new LinkedHashMap<>();
            boolean isId = false;
            // 先找自增id
            for(Field field: fields){
                if(field.getName().equalsIgnoreCase("id") && field.getType() == int.class){
                    //找到了
                    isId = true;
                }
            }
            if(!isId){
                throw new NullPointerException("数据库类需要一个id");
            }
            stringStringLinkedHashMap.put("id","integer primary key autoincrement");
            for(Field field: fields){
                if(field.getName().equalsIgnoreCase("id") && field.getType() == int.class){
                    //找到了
                    continue;
                }
                if(field.getType() == float.class || field.getType() == double.class){
                    stringStringLinkedHashMap.put(field.getName().toLowerCase(),field.getType().getName());
                }else{
                    stringStringLinkedHashMap.put(field.getName().toLowerCase(),"varchar(20)");
                }
            }
            return new DBTable(stringStringLinkedHashMap);

        }

    }

    public static DBOpenHelper createDBHelper(Context context,String tableName,DBTable tables,int version){
        DBOpenHelper.NAME = tableName;
        DBOpenHelper.tables = tables;
        return new DBOpenHelper(context,DBOpenHelper.DB_FILE,null,version);

    }

    private <T> T explainClass(Cursor cursor, Class tc, T t){
        for (String name : cursor.getColumnNames()) {
            try {
                Field field = tc.getField(name);
                if(field.getType() == int.class){
                    field.set(t, cursor.getInt(cursor.getColumnIndex(name)));
                }else
                if(field.getType() == float.class || field.getType() == double.class){
                    field.set(t, cursor.getFloat(cursor.getColumnIndex(name)));
                }else
                if(field.getType() == boolean.class){
                    field.set(t, Boolean.valueOf(cursor.getString(cursor.getColumnIndex(name))));

                }else
                if(field.getType() == long.class){
                    field.set(t, cursor.getLong(cursor.getColumnIndex(name)));

                }else{
                    field.set(t, cursor.getString(cursor.getColumnIndex(name)));
                }
            } catch (IllegalAccessException | NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
        return t;
    }

    public void clear(){
        context.deleteDatabase(DB_FILE);

    }

}

后话

当数据存储过多的时候使用 getAll 是很不理智的,最好改写一下,读取改为分页读取。

猜你喜欢

转载自blog.csdn.net/qq_38174131/article/details/126122627