SQLite 数据库封装
2016-08-05 14:28
253 查看
昨天看了下 简书,发现有人上面写的一个自定义控件的封装跟我之前写的一模一样,哈哈。 用builder模式封装的alertdialog,不过我在项目中已经实现了builder模式封装的好多控件,popupwindow等等。这里推崇下谷歌推崇的链式封装思路—build模式。你们平时封装一些自定义控件的时候可以参考下这个模式,只是顺带提一下。
顺带提一下Android设计模式吧,个人推崇的一个设计模式就是横向+纵向的设计模式。横向实现接口,纵向继承一些BaseActivity。BaseActivity做view层的初始化,纵向如果不是太复杂,就把modle层和业务逻辑层放在第二层操作,如果复杂的话,再分一层,第二层做业务逻辑层,第三层做modle层。
本篇讲的是sqlite3的简单封装,下篇会讲到链式封装+反射的sqlite3封装。有人说 sqlite3过时了,网上好多新好用的数据库。本文讲的不是如何用数据库,而是封装的模式和思路。重点看思想。
好了不多说了,看代码:
这里专门存储数据库名称、table名称以及创建table语句
上面数据库操作,使用了两种单例模式,可以借鉴下。如果想建新的 table模型,参考DatabaseUserHelper就好了。
UserBean 没啥好讲的
调用activity,也没啥好讲的,太esay了。
上面是db_sql.xml。
好了不多说了,看到上面的代码是不是眼睛会舒服一点,因为做了很多封装。具体用了哪几种设计模式,本人也不太懂,只是觉得这样封装好用,你们可以参看下。OK,就这样吧,等待下篇的反射和builder模式封装的sqlite吧。
顺带提一下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吧。
相关文章推荐
- Sqlite3 数据库介绍及常用方法的简单封装
- sqlite3 数据库封装 (聊天室用的)
- SQLiteOpenHelper的使用,对数据库操作的封装
- Android数据库sqlite封装心得
- Android_应用层_SQlite封装数据库工具
- 利用反射实现对sqlite3数据库的crud(增删改查)操作的一个baseAndroidDao封装,安卓开发中
- Sqlite3 数据库介绍及常用方法的简单封装
- Android-SQLite封装sql语句以及查看数据库
- Android sqlite数据库的封装使用
- Sqlite3 数据库介绍及常用方法的简单封装
- 关于轻量级数据库SQLite一个简单的SQLiteHelper访问数据库封装类
- 【android开发记录片】3.数据库SQLite 的对象封装
- 【android开发记录片】3.数据库SQLite 的对象封装
- sqlite查询数据库数据cursor转list封装
- 基于 iOS SQLite 增删改查基本方法的封装---通用式数据库访问类
- ios-数据库-sqlite-数据库得封装(自己写得,有很多不严谨)最后还有一个单例得实现
- android 本地数据库sqlite的封装
- android 本地数据库sqlite的封装
- android SQLite数据库封装
- Sqlite 反射机制封装数据库