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的操作还是比较简单便捷的。就是到生成文件找了一会。
- Android中SQLite使用及DataBase管理
- android database sqlite的使用
- greenDao使用中android.database.sqlite.SQLiteException: no such table
- Android Studio中使用SQLite问题:android.database.sqlite.SQLiteException: no such table: XXX (code 1)
- Android SQLite Database的使用模板
- android database SQLite
- Android SQLite Database
- Android SQLite Database Tutorial
- android.database.sqlite
- SQLite android.database.CursorIndexOutOfBoundsException
- Create Android SQLite database
- Android中SQLite使用
- Android中SQLite使用
- Android中SQLite使用
- Android中SQLite使用
- Android中Sqlite使用
- Android中使用sqlite
- 使用浏览器查看Android SQLite数据库-Android Debug Database用法
- HDU1200-To and Fro(字符串)
- 问题 : 带通配符的数
- JDBC事务控制
- 左旋转字符串
- java File类
- Android中SQLite使用及DataBase管理
- Scanner 的next()或nextInt()与nextLine()连续调用时出现的问题
- ios开发 利用AFNetworking实现同时上传字符串与图片数据
- Navicat for Oracle Cannot load OCI DLL
- Rikka with Subset HDU
- Activity启动模式与任务栈全面解析(上)
- 什么是 Delphi.NET-
- windows下用navicat远程链接虚拟机Linux下MySQL数据库
- java各种排序算法实现