Android中SQLite数据库入门知识
来源:互联网 发布:mac dock栏设置 编辑:程序博客网 时间:2024/06/05 23:54
SQLite数据库介绍:
Android内置的小型的,关系型,文本型数据库。通过SQLiteOpenHelper来实现数据库操作。
特点:应用程序中的任何类可以通过名称来访问数据库。但应用程序之外就不能访问。
SQLiteOpenHelper类介绍:
作用:通过获取到具体数据库的引用来管理数据库(创建,增加,修改,删除)和版本的控制;
使用过程:通过创建继承SQLiteOpenHelper的子类,实现一些方法来执行对数据库的操作,如下实例代码;
private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION); // CursorFactory设置为null,使用系统默认的工厂类 } @Override public void onCreate(SQLiteDatabase db) { // 这个方法中主要完成创建数据库后对数据库的操作,即便程序修改重新运行, //只要数据库已经创建过,就不会再进入这个onCreate方法 ... } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //调用时机newVersion>oldVersion db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); // 当回调OnUdgrade时,删除旧表,然后调用onCreate来创建新表, //这样的操作在实际开发中不推荐,正确的做法是在更新数据表结构时, //还要考虑用户存放于数据库中的数据不丢失。 ... } }
参数解读
实际开发过程中中:为了更好的管理和维护数据库,封装一个继承自SqliteOpenHelper的数据库操作类,然后以这个类作为基类继续封装我们需要的业务逻辑。
常用方法介绍
notes:
(1)onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
(2)onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级或者表结构更新时才需改变版本号,而数据库的版本是由程序员控制的。假设数据库原来的版本是1,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新的一些逻辑操作。
SQLiteDatabase类介绍:
作用:负责执行具体的增删改查操作
常用方法介绍
notes:
(1)一个数据库中可以有多个数据表
SQLite入门基础
利用SQLiteOpenHelper来获取数据库对象
(1) 利用getWriteableDatabase()和getReadableDatabase()获取数据库对象的引用,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。
关键代码
mDbHelper = new DatabaseHelper(context); mDb = mDbHelper.getWritableDatabase();
安卓中SQLite的增删改查操作
1.数据增加操作
(1).利用ContentValues作为容器,它实现了Parcelable接口,可序列化,底层是对HashMap的封装。传入参数是必须是Key(String),Value(Object);String对应的是创建表时候的列名。
ContentValues values = new ContentValues();initialValues.put(KEY_ID, id);initialValues.put(KEY_PIC_URL, picUrl);
(2).利用SQLiteDatabase类中的insert的方法往指定表名TABLE_NAME传入上一步自己生成的values;通过其返回值判断是否操作成功,返回-1则操作失败,成功则返回最新插入数据的所在的行号;
SQLiteDatabase mDb;// 采用事务处理,确保数据完整性 mDb.beginTransaction(); // 开始事务 try{long createResult = mDb.insert(TABLE_NAME, null, values);db.setTransactionSuccessful(); // 设置事务成功完成} finally { db.endTransaction(); // 结束事务}
notes :try…finally语句块可加可不加。
2.数据删除操作
(1)删除表中全部数据,使用delete()方法,第一个参数是数据表名,第二个参数是条件语句,第三个参数是条件参数;如果第二三个参数为空则删除所有行数据,返回值是删除操作影响的行数。
int deleteResult = mDb.delete(TABLE_NAME, null, null);
(2)根据字段名删除表中的数据
int isDelete;String[] tName = new String[] {id};isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName);
3.更新数据表操作
使用ContentValues存储键值对,update语句的第一个参数是数据表名,第二个为你需要更新的对应列和值,第三个参数是条件语句,第四个参数是条件参数
public void updatePicUrl(User user) { Logger.d("updatePicUrl"); ContentValues values = new ContentValues(); values.put("age", user.getPicUrl()); db.update(TABLE_NAME, values, "id = ?", new String[] { user.getId(); });}
4.查询数据操作
使用ArrayList存储POJO类的用户数据,利用Cursor来获取每一行的数据,在后续操作中将其存入ArrayList中;
参数解读:
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
Notes:一般简单的操作只要填前四个参数就行
查询表中所有数据并将其存储在ArrayList
public ArraryList<User> queryAll() { ArrayList<User> allUsersList = new ArrayList<>(); Cursor mCursor = null; mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null); if (mCursor.moveToFirst()) { do { User user = new User(); user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID))); user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL))); allUsersList.add(user); } while (mCursor.moveToNext()); } if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } return allUsersList; }
使用样例代码
CommDB.java
public class CommDB { public static final String DATABASE_NAME = "MoveDatabase.db"; //数据库名称 public static final int DATABASE_VERSION = 1; //创建图像url对应id的表 private static final String CREATE_TABLE_ImgRecords = "create table if not exists" + ImgRecordsDB.TABLE_NAME + "(" + ImgRecordsDB.KEY_ID +"integer," + ImgRecordsDB.KEY_PIC_URL +"varchar(200))"; //创建搜索记录表 private static final String CREATE_TABLE_SearchRecords = "create table if not exists" + SearchRecordsDB.TABLE_NAME + "(" + SearchRecordsDB.KEY_ID + "integer primary key autoincrement," + SearchRecordsDB.KEY_Content +"varchar(200))"; private final Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; public CommDB(Context ctx) { this.context = ctx; this.DBHelper = new DatabaseHelper(this.context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_ImgRecords);//创建图像记录表 db.execSQL(CREATE_TABLE_SearchRecords);//创建搜索记录表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //当提供的新版本号比旧版号大的时候,将会回调该方法 } } public CommDB open() throws SQLException { this.db = this.DBHelper.getWritableDatabase(); return this; } public void close() { this.DBHelper.close(); }}
ImgRecordsDB.java
public class ImgRecordsDB { public static final String KEY_ID = "id"; public static final String KEY_PIC_URL = "picUrl"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; public static final String TABLE_NAME = "ImgRecords"; private final Context context; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Logger.d("Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } public ImgRecordsDB(Context ctx) { this.context= ctx; } public ImgRecordsDB open() throws SQLException { mDbHelper = new DatabaseHelper(context); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { if (mDbHelper != null) { mDbHelper.close(); } } //下面开始封装一些具体的自定义的数据库操作 /** * 创建一个保存用户id和对应图像url的 * @param id * @param picUrl * @return */ public long createUser(String id,String picUrl) { long createResult = 0; ContentValues initialValues = new ContentValues(); initialValues.put(KEY_ID, id); initialValues.put(KEY_PIC_URL, picUrl); try { createResult = mDb.insert(TABLE_NAME, null, initialValues); Logger.d("the new row is " + createResult); } catch (Exception e) { //在这里添加一些自定义的异常处理 Logger.d("delete all data failed!"); e.printStackTrace(); } return createResult; } /** * 删除表中全部数据 * @return */ public boolean deleteAllUsers() { int deleteResult = 0; try { deleteResult = mDb.delete(TABLE_NAME, null, null); Logger.d(deleteResult+"row has been deleted!"); } catch (Exception e) { //在这里添加一些自定义的异常处理 e.printStackTrace(); } return deleteResult > 0; } /** * 根据名称删除表中的数据 * @param id * @return */ public boolean deleteUserByID(String id) { int isDelete; String[] tName = new String[] {id}; isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName); Logger.d("isDelete:" + isDelete + "---" + "UserID = " + id); return isDelete > 0; } /** * 获取表中的所有字段 * @return */ public ArrayList<User> queryAll() { ArrayList<User> allUsersList = new ArrayList<>(); Cursor mCursor = null; mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null); if (mCursor.moveToFirst()) { do { User user = new User(); user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID))); user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL))); allUsersList.add(user); } while (mCursor.moveToNext()); } if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } return allUsersList; }}
目前还处于更新状态,不足之处,请谅解
- Android中SQLite数据库入门知识
- android sqlite入门知识
- Android SQLite数据库相关知识
- Android中数据库Sqlite
- Android中SQLite数据库
- Android入门之数据库SQLite
- android 轻量级数据库sqlite入门
- 查看android中Sqlite数据库
- Android中SQLite数据库学习心得
- android中sqlite数据库处理
- Android中sqlite数据库应用
- Android中调用Sqlite数据库
- android 中数据库SQLite使用
- Android中SQLite数据库小结
- android中sqlite数据库操作
- Android编程中数据库SQLite
- android中操纵sqlite数据库
- android中SQLite数据库操作
- java 设计模式 策略模式 以英雄联盟为背景
- 堆排序
- Android常用
- Linux — 守护进程
- android自定义串点分割线(由圆点组成一条线)
- Android中SQLite数据库入门知识
- NSStringCompareOptions
- 在 Jenkins 中,使用 maven 打包报 package xxx does not exist 问题的解决方法
- ueditor 的java实现粘贴微信文章时 反微信反盗链
- 2017 最新的 cocoaPods 安装方法
- 在线编程四
- https 安全验证问题
- jQuery的ajax学习(一)表单序列化
- Android启动分析