ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Android-SQLite数据库实例,Android开发面试基础

2021-12-20 13:06:36  阅读:241  来源: 互联网

标签:SQLite SQLiteDatabase COLUMN 数据库 实例 SQL Android public


②文件存储数据

③SQLite数据库存储数据

④使用ContentProvider存储数据

⑤网络存储数据

使用SQLite保存数据


对于重复数据或结构化数据(例如联系信息),将数据保存到数据库是理想选择。下面咱咱就开始在Android上使用SQLite数据库。android.database.sqlite软件包中提供了在Android上使用数据库所需的API。

咱先玩玩SQLite数据库,后面咱从SQLite迁移到Room。

注意:虽然这些API功能强大,但它们的级别较低,使用起来需要花费大量时间和精力:

  • 没有针对原始SQL查询的编译时验证。随着数据图表不断发生变化,你需要手动更新受影响的SQL查询。此过程既耗时又容易出错。

  • 你需要使用大量样板代码,在SQL查询和数据对象之间进行转换。

出于这些原因,咱强烈建议将Room持久性库用作抽象层以访问应用的SQLite数据库中的信息。

SQL的基本语法


SQL本质上是一种编程语言,它的学名叫作“结构化查询语言”(全称为StructuredQuery Language,简称SQL)。不过SQL语言并非通用的编程语言,它专用于数据库的访问和处理,更像是一种操作命令,所以常说SQL语句而不说SQL代码。标准的SQL语句分为3类:数据定义、数据操纵和数据控制,但不同的数据库往往有自己的实现。

SQLite是一种小巧的嵌入式数据库,使用方便、开发简单。如同MySQL、Oracle那样,SQLite也采用SQL语句管理数据,由于它属于轻型数据库,不涉及复杂的数据控制操作,因此App开发只用到数据定义和数据操纵两类SQL。此外,SQLite的SQL语法与通用的SQL语法略有不同。

数据库帮助器SQLiteOpenHelper


由于SQLiteDatabase存在局限性,一不小心就会重复打开数据库,处理数据库的升级也不方便;因此Android提供了数据库帮助器SQLiteOpenHelper,帮助开发者合理使用SQLite。

SQLiteOpenHelper的具体使用步骤如下:

****步骤1:****新建一个继承自SQLiteOpenHelper的数据库操作类,按提示重写onCreate和onUpgrade两个方法。其中,onCreate方法只在第一次打开数据库时执行,在此可以创建表结构;而onUpgrade方法在数据库版本升高时执行,在此可以根据新旧版本号变更表结构。

****步骤2:****为保证数据库安全使用,需要封装几个必要方法,包括获取单例对象.打开数据库连接、关闭数据库连接,说明如下:

  • 获取单例对象:确保在App运行过程中数据库只会打开一次,避免重复打开引起错误。

  • 打开数据库连接:SQLite有锁机制,即读锁和写锁的处理;故而数据库连接也分两种,读连接可调用getReadableDatabase方法获得,写连接可调用getWritableDatabase获得。

  • 关闭数据库连接:数据库操作完毕,调用数据库实例的close方法关闭连接。

****步骤3:****提供对表记录增加、删除、修改、查询的操作方法。

继承SQLiteOpenHelper类,重写onCreate、onUpgrade、onOpen方法

public class UserDBHelper extends SQLiteOpenHelper {

private static final String DB_NAME = “user.db”;//数据库的名称

private static UserDBHelper mHelper = null;//数据库帮助器的实例

private SQLiteDatabase mDB = null;//数据库的实例

public static final String TABLE_NAME = “user_info”;

public static final String _ID = “_id”;

public static final String COLUMN_NAME = “name”;

public static final String COLUMN_AGE = “age”;

public static final String COLUMN_UPDATE_TIME = “update_time”;

/**

  • @param context 上下文环境(例如,一个 Activity)

  •            DB_NAME  数据库名字
    
  •            factory  null  一个可选的游标工厂(通常是 Null)
    
  • @param version 数据库模型版本的整数

  •            会调用父类 SQLiteOpenHelper的构造函数
    

*/

public UserDBHelper(Context context, int version) {

super(context, DB_NAME, null, version);

}

//利用单例模式获取SQLiteOpenHelper的唯一实例

public static UserDBHelper getInstance(Context context, int version) {

if (version > 0 && mHelper == null) {

mHelper = new UserDBHelper(context, version);

}

return mHelper;

}

//创建数据库表,执行建表语句

@Override

public void onCreate(SQLiteDatabase db) {

}

/**

  • 当数据库需要修改的时候(两个数据库版本不同),Android系统会主动的调用这个方法。

  • 一般我们在这个方法里边删除数据库表,并建立新的数据库表.

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

@Override

public void onOpen(SQLiteDatabase db) {

//每次成功打开数据库后首先被执行

super.onOpen(db);

}

}

创建表

表格的创建动作由create命令完成,格式为“CREATE TABLE IFNOT EXISTS表格名称(以逗号分隔的各字段定义);”。以用户信息表为例,它的建表语句如下所示:

//创建数据库表,执行建表语句

@Override

public void onCreate(SQLiteDatabase db) {

Log.e(getClass().getName(), “onCreate”);

//创建表语句

String SQL_CREATE_ENTRIES = "CREATE TABLE IF NOT EXISTS "

  • TABLE_NAME + “(”

  • _ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"

  • COLUMN_NAME+" VARCHAR NOT NULL,"

  • COLUMN_AGE+" INTEGER NOT NULL,"

  • COLUMN_UPDATE_TIME+" VARCHAR NOT NULL" + "); ";

//执行完整的sQL语句

db.execSQL(SQL_CREATE_ENTRIES);

}

上面的SQL语法与其他数据库的SQL语法有所出入,相关的注意点说明见下:

①SQL语句不区分大小写,无论是create与table这类关键词,还是表格名称、字段名称,都不区分大小写。唯一区分大小写的是被单引号括起来的字符串值。

②为避免重复建表,应加上IF NOT EXISTS关键词,例如CREATE TABLE

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

IFNOT EXISTS表格名称…

③SQLite支持整型INTEGER、长整型LONG、字符串VARCHAR、浮点数FLOAT,但不支持布尔类型。布尔类型的数据要使用整型保存,如果直接保存布尔数据,在入库时sQLite会自动将它转为0或1,其中0表示false,1表示true。

④建表时需要唯一标识字段,它的字段名为_id。创建新表都要加上该字段定义,例如_id lNTEGER PRIMARY KEY AUTOINCREMENT NOT NULL。

删除表

表格的删除动作由drop命令完成,格式为“DROP TABLE IFEXISTS表格名称;”。下面是删除用户信息表的SQL语句例子:

//删除表

public void deleteTable(SQLiteDatabase db) {

String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME;

db.execSQL(SQL_DELETE_ENTRIES);

}

打开数据库表

下面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就可以查询或者修改数据库。

//打开数据库的读连接(查询数据库)

public SQLiteDatabase openReadLink() {

if (mDB == null || !mDB.isOpen()) {

mDB = mHelper.getReadableDatabase();

}

return mDB;

}

//打开数据库的写连接(可写数据库)

public SQLiteDatabase openwriteLink() {

if (mDB == null || !mDB.isOpen()) {

mDB = mHelper.getWritableDatabase();

}

return mDB;

}

关闭数据库

//由于在数据库关闭时,调用getWritableDatabase()和getReadableDatabase()的成本比较高,

// 因此只要您有可能需要访问数据库,就应保持数据库连接处于打开状态。通常情况下,

// 最好在发出调用的Activity的onDestroy()中关闭数据库。

@Override

protected void onDestroy() {

userDBHelper.closeLink();

super.onDestroy();

}

添加数据

使用 SQLiteDatabase 对象的insert()。

//往该表添加多条记录

public long insert(List infoList) {

long result = -1;

for (int i = 0; i < infoList.size(); i++) {

UserInfoBean info = infoList.get(i);

//不存在唯一性重复的记录,则插入新记录

ContentValues cv = new ContentValues();

cv.put(_ID, info.get_id());

cv.put(COLUMN_NAME, info.getName());

cv.put(COLUMN_AGE, info.getAge());

cv.put(COLUMN_UPDATE_TIME, info.getUpdate_time());

//执行插入记录动作,该语句返回插入记录的行号

result = mDB.insert(TABLE_NAME, “”, cv);

if (result == -1) {//添加成功则返回行号,添加失败则返回-1

return result;

}

}

return result;

}

方法使用:

List list = new ArrayList<>();

list.add(new UserInfoBean(“10”, “帅次次”, 20, “09:00”));

list.add(new UserInfoBean(“12”, “朱元璋”, 30, “11:00”));

list.add(new UserInfoBean(“15”, “赵匡胤”, 40, “13:00”));

list.add(new UserInfoBean(“18”, “李世民”, 50, “15:00”));

long l = userDBHelper.insert(list);

tv_sql.setText(“插入成功:” + l);

修改数据

使用SQLiteDatabase 对象的update()方法。

//根据条件更新指定的表记录

public int update(UserInfoBean info, String condition) {

ContentValues cv = new ContentValues();

cv.put(COLUMN_NAME, info.getName());

cv.put(COLUMN_AGE, info.getAge());

cv.put(COLUMN_UPDATE_TIME, info.getUpdate_time());

//执行更新记录动作,该语句返回更新的记录数量

return mDB.update(TABLE_NAME, cv, condition, null);

}

方法使用:

UserInfoBean bean = new UserInfoBean(“武媚娘”, 32,“12:00”);

userDBHelper.update(bean, “_id=18”);

标签:SQLite,SQLiteDatabase,COLUMN,数据库,实例,SQL,Android,public
来源: https://blog.csdn.net/m0_64604636/article/details/122038967

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有