SQLite 数据库封装

昨天看了下 简书,发现有人上面写的一个自定义控件的封装跟我之前写的一模一样,哈哈。 用builder模式封装的alertdialog,不过我在项目中已经实现了builder模式封装的好多控件,popupwindow等等。这里推崇下谷歌推崇的链式封装思路—build模式。你们平时封装一些自定义控件的时候可以参考下这个模式,只是顺带提一下。

顺带提一下Android设计模式吧,个人推崇的一个设计模式就是横向+纵向的设计模式。横向实现接口,纵向继承一些BaseActivity。BaseActivity做view层的初始化,纵向如果不是太复杂,就把modle层和业务逻辑层放在第二层操作,如果复杂的话,再分一层,第二层做业务逻辑层,第三层做modle层。

本篇讲的是sqlite3的简单封装,下篇会讲到链式封装+反射的sqlite3封装。有人说 sqlite3过时了,网上好多新好用的数据库。本文讲的不是如何用数据库,而是封装的模式和思路。重点看思想。
好了不多说了,看代码:

这里专门存储数据库名称、table名称以及创建table语句

public class DBConstant {

    /**
     * database name
     */
    public static String dbTest = "test.db";
    /**
     * user db sql
     */
    public static String sqlUser = "create table user(id int PRIMARY KEY,name varchar(20),age int)";

    /**
     * table name
     */
    public static String userTable = "user";

}
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String TAG = "sql_db";

    private String sqlStr;

    //三个不同参数的构造函数
    //带全部参数的构造函数,此构造函数必不可少  
    public DatabaseHelper(Context context, String name, CursorFactory factory,
                          int version, String sqlStr) {
        super(context, name, factory, version);
        this.sqlStr = sqlStr;

    }

    //带两个参数的构造函数,调用的其实是带三个参数的构造函数
    public DatabaseHelper(Context context, String name, String sqlStr) {
        this(context, name, VERSION, sqlStr);
    }

    //带三个参数的构造函数,调用的是带所有参数的构造函数
    public DatabaseHelper(Context context, String name, int version, String sqlStr) {
        this(context, name, null, version, sqlStr);
    }

    //创建数据库
    public void onCreate(SQLiteDatabase db) {
        Log.i(TAG, "create a Database");
        //创建数据库sql语句
        if (!TextUtils.isEmpty(sqlStr)) {
            db.execSQL(sqlStr);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //创建成功,日志输出提示  
        Log.i(TAG, "update a Database");
    }

}  
public class DatabaseUserHelper {

    private static Context mContext;
    private static DatabaseHelper dbUserHelper;

    private String TAG = "sql_db";

    public DatabaseUserHelper() {
    }

    private static class SingletonHolder {
        private static DatabaseUserHelper dbUser = new DatabaseUserHelper();
    }

    /**
     * 获取单例
     * 这里使用了两种不同类型的单例模型
     */
    public static DatabaseUserHelper getInstance(Context context) {
        if (dbUserHelper == null) {
            dbUserHelper = new DatabaseHelper(context, DBConstant.dbTest, DBConstant.sqlUser);
        }
        mContext = context;
        return SingletonHolder.dbUser;
    }

    /**
     * save data
     *
     * @param user
     */
    public void saveUser(User user) {
        SQLiteDatabase db = dbUserHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        //像ContentValues中存放数据
        values.put("id", user.getId());
        values.put("name", user.getName());
        values.put("age", user.getAge());

        //数据库执行插入命令
        synchronized (db) {
            db.insert(DBConstant.userTable, null, values);
        }
    }

    /**
     * save data
     *
     * @param list
     */
    public void saveUser(List<User> list) {
        SQLiteDatabase db = dbUserHelper.getWritableDatabase();
        for (User user : list) {
            ContentValues values = new ContentValues();
            //像ContentValues中存放数据
            values.put("id", user.getId());
            values.put("name", user.getName());
            values.put("age", user.getAge());

            //数据库执行插入命令
            synchronized (db) {
                db.insert(DBConstant.userTable, null, values);
            }
        }
    }


    /**
     * update data
     */
    public void updateUserById(User user, int id) {
        SQLiteDatabase db = dbUserHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", user.getName());
        values.put("age", user.getAge());
        synchronized (db) {
            db.update(DBConstant.userTable, values, "id=?", new String[]{String.valueOf(id)});
        }
    }

    /**
     * query
     */
    public User queryById(int id) {
        User user = null;

        SQLiteDatabase db = dbUserHelper.getReadableDatabase();
        //创建游标对象
        Cursor cursor = null;
        synchronized (db) {
            cursor = db.query(DBConstant.userTable, new String[]{"id", "name", "age"}, "id=?", new String[]{String.valueOf(id)}, null, null, null, null);
        }
        //利用游标遍历所有数据对象
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            //日志打印输出
            Log.i(TAG, "query-->name:" + name + "----age:" + age);
            user = new User(id, name, age);
        }
        cursor.close();

        return user;
    }

    /**
     * query
     */
    public List<User> queryByAge(int age) {
        List<User> list = new ArrayList<>();

        SQLiteDatabase db = dbUserHelper.getReadableDatabase();
        //创建游标对象
        Cursor cursor = null;
        synchronized (db) {
            cursor = db.query(DBConstant.userTable, new String[]{"id", "name", "age"}, "age=?", new String[]{String.valueOf(age)}, null, null, null, null);
        }
        //利用游标遍历所有数据对象
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            //日志打印输出
            Log.i(TAG, "query-->name:" + name + "-----id:" + id + "-----age:" + age);
            User user = new User(id, name, age);
            list.add(user);
        }
        cursor.close();

        return list.size() == 0 ? null : list;
    }

    public void deleteById(int id) {

        SQLiteDatabase db = dbUserHelper.getWritableDatabase();
        synchronized (db) {
            db.delete(DBConstant.userTable, "id=?", new String[]{String.valueOf(id)});
        }
    }


}

上面数据库操作,使用了两种单例模式,可以借鉴下。如果想建新的 table模型,参考DatabaseUserHelper就好了。

public class User {

    private int id;
    private String name;
    private int age;

    public User() {
    }

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

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

UserBean 没啥好讲的

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import com.example.xiao8.appinvoke.R;


import cn.android.sword.sqlite.bean.User;
import cn.android.sword.sqlite.db.DatabaseUserHelper;

public class SQLiteActivity extends Activity implements OnClickListener {
    private final static String TAG = "sql_db";


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.db_sql);
        initViews();
    }

    private void initViews() {
        //根据控件ID得到控件  
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.update).setOnClickListener(this);
        findViewById(R.id.query).setOnClickListener(this);
        findViewById(R.id.delete).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        //判断所触发的被监听控件,并执行命令  
        switch (v.getId()) {

            //插入数据
            case R.id.insert:
                User user = new User(1, "xiaoxin",20);
                DatabaseUserHelper.getInstance(this).saveUser(user);
                break;
            //更新数据信息
            case R.id.update:
                User user1 = new User(1, "xiaosan",25);
                DatabaseUserHelper.getInstance(this).updateUserById(user1, user1.getId());
                break;
            //查询信息
            case R.id.query:
                User users = DatabaseUserHelper.getInstance(this).queryById(1);

                break;
            //删除记录
            case R.id.delete:
                DatabaseUserHelper.getInstance(this).deleteById(1);
                break;
            default:
                Log.i(TAG, "error");
                break;
        }
    }
}  

调用activity,也没啥好讲的,太esay了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <Button
        android:id="@+id/insert"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="insert"/>
    <Button
        android:id="@+id/update"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="update"/>
    <Button
        android:id="@+id/query"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="query"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="delete"/>

</LinearLayout>  

上面是db_sql.xml。

好了不多说了,看到上面的代码是不是眼睛会舒服一点,因为做了很多封装。具体用了哪几种设计模式,本人也不太懂,只是觉得这样封装好用,你们可以参看下。OK,就这样吧,等待下篇的反射和builder模式封装的sqlite吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值