您的位置:首页 > 数据库

SQLite 数据库封装

2016-08-05 14:28 253 查看
昨天看了下 简书,发现有人上面写的一个自定义控件的封装跟我之前写的一模一样,哈哈。 用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吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite