Android中SQLite使用及DataBase管理

来源:互联网 发布:javaweb考试系统源码 编辑:程序博客网 时间:2024/06/06 09:56
在实际项目编码中,大家可能经常用到sharepreference和sqlite用于数据存储,其底层原理都是以文件的形式进行存储。今天我们就来讲讲sqlite存储的使用。使用过数据库的小伙伴们对sqlite的使用应该能够很快上手。见代码。

在操作sqlite数据库时,一共用到三个类:SQLiteOpenHelper,SQLiteDatabase,Cursor(结果集)。一共包含五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象),但是在编码的时候像弱语言,varchar等数据类型也能识别,可能是自动转换成text数据类型了。所以我比较习惯用sql命令来操作,减少了很多麻烦。

import android.content.Context;import android.database.DatabaseErrorHandler;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;/** * Created by qiang.lin,NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象) */public class MySQLiteOpenHelper extends SQLiteOpenHelper {    private static final String DATA_NAME = "user.db";    private static final int VERSION=1;    public MySQLiteOpenHelper(Context context) {        super(context, DATA_NAME, null, VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        String sql = "CREATE TABLE user(id VARCHAR(10) NOT NULL,name VARCHAR(10) NOT NULL, password VARCHAR(10) NOT NULL,PRIMARY KEY(id));";        db.execSQL(sql);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        Log.i("----版本迭代的时候会使用", "---");    }}

这是一个SQLDataBase的管理类,对操作进行管理。db和cursor要及时关闭,否则会导致内存溢出。我只写了sql语句的操作,因为我感觉这个比较简单明了,有sql基础的小伙伴一看便知。

import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import example.com.mvpdesign.sqlite.MySQLiteOpenHelper;/** * Created by qiang.lin  */public class DataBaseManager {    private static final String TAG = DataBaseManager.class.getSimpleName();    private static DataBaseManager dataBaseManager;    private MySQLiteOpenHelper mySQLiteOpenHelper;    private SQLiteDatabase sqLiteDatabase;    private DataBaseManager(Context context) {        mySQLiteOpenHelper = new MySQLiteOpenHelper(context.getApplicationContext());    }    /**     * 单例模式     *     * @return 对象     */    public static DataBaseManager getInstance(Context context) {        if (dataBaseManager == null) {            synchronized (DataBaseManager.class) {                if (dataBaseManager == null) {                    dataBaseManager = new DataBaseManager(context);                }            }        }        return dataBaseManager;    }    /**     * 增删改     *     * @param sql     * @param bindArgs 占位符值     * @return 成功or失败     */    public boolean executeSQL(String sql, Object[] bindArgs) {        sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();        try {            sqLiteDatabase.execSQL(sql, bindArgs);        } catch (SQLException e) {            e.printStackTrace();            return false;        } finally {            sqLiteDatabase.close();        }        return true;    }    /**     * cursor是结果集,查询     *     * @param sql     * @param bindArgs 占位符的值     */    public Cursor selectSQL(String sql, String[] bindArgs) {        sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();        Cursor cursor = null;        try {            cursor = sqLiteDatabase.rawQuery(sql, bindArgs);            if (cursor != null && cursor.getCount() > 0) {                return cursor;            }        } catch (SQLException e) {            e.printStackTrace();            return null;        } finally {            cursor.close();            sqLiteDatabase.close();        }        return null;    }}

插入操作

 boolean flag = DataBaseManager.getInstance(SqliteActivity.this).executeSQL("insert into user(id,name,password) values(?,?,?);", new String[]{"1", "李四", "234"});

删除操作

    boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("delete from user where id=? ", new String[]{"1"});

修改操作

  boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("update user set name=? where id=?;", new String[]{"张三", "1"});

查询操作

StringBuffer sb = new StringBuffer();  Cursor cursor=DataBaseManager.getInstance(SqliteActivity.this).selectSQL("select * from user where id=?;",new String[]{"10"});   if (cursor != null && cursor.getCount() > 0) {            while (cursor.moveToNext()) {                String id = cursor.getString(cursor.getColumnIndex("id"));                String name = cursor.getString(cursor.getColumnIndex("name"));                String password = cursor.getString(cursor.getColumnIndex("password"));                sb.append("id:" + id + "----" + "name:" + name + "------" + "password:" + password);                Log.i("数据库------", sb.toString());            }        }        cursor.close();

事务,两个或以上的操作相互关联操作,如果其中一个失败了,将会事务回滚,该次操作回到进入时的数据状态,操作失败。

 public void transactionData() {        sqLiteDatabase.beginTransaction();        try {            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"王五", "8"});            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"李四", "8"});                     sqLiteDatabase.setTransactionSuccessful();        } catch (SQLException e) {            e.printStackTrace();        } finally {            sqLiteDatabase.endTransaction();            sqLiteDatabase.close();        }    }

到此SQLite的使用就完成了,其实操作也是很简单的,运行完成后,会在data/data/com.example.项目名/ 生成 一个user.db文件,可以通过shell命令查看,配置adb。也可以用第三方软件导出查看(SQLiteExpert.zip),小编是用该软件打开。后来发现其实在使用虚拟机的时候,虚拟机支持直接代开sqlite文件,所以直接打开就可以看到库表。
如果你的sql基础不是很好,可以试一试用第三方的开源框架,如litepal,该框架小编是在朋友的推荐下看了下,使用起来还是很简单便捷的。
总结:1、感觉Manger管理类设计的不是很合理,如果小伙伴们有更好的设计思路,可以提供给小编。
2、相比于数据库,sqlite的操作还是比较简单便捷的。就是到生成文件找了一会。

原创粉丝点击