/**
-
当数据库需要修改的时候(两个数据库版本不同),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 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”);
查找数据
使用SQLiteDatabase 对象的query()方法。
//根据指定条件查询记录,并返回结果数据列表
public List query() {
List infoList = new ArrayList();
//执行记录查询动作,该语句返回结果集的游标
//SELECT语句内容作为 query()方法的参数,比如:要查询的表名,要获取的字段名,WHERE条件,
//包含可选的位置参数,去替代WHERE条件中位置参数的值,GROUP BY条件,HAVING条件。
//除了表名,其他参数可以是null
Cursor cursor = mDB.query(TABLE_NAME, null, null, null, null, null, null);
//循环取出游标指向的每条记录
while (cursor.moveToNext()) {
UserInfoBean info = new UserInfoBean();
info._id = cursor.getString(0);//取出字符串
info.name = cursor.getString(1);//取出字符串
info.age = cursor.getInt(2);//取出整型数
info.update_time = cursor.getString(3);//取出字符串
infoList.add(info);
}
cursor.close();
// 查询完毕,关闭数据库游标
return infoList;
}
方法使用:
userDBHelper.query();
删除数据
使用SQLiteDatabase 对象的delete()方法。
//根据指定条件删除表记录
public int delete(String condition) {
//执行删除记录动作,该语句返回删除记录的数目
return mDB.delete(TABLE_NAME, condition, null);
}
方法使用:
userDBHelper.delete(“_id=12”);
在未创建表或者删除表后不要对表进行操作报错
1、添加数据失败(Error)程序报错
android.database.sqlite.SQLiteException: no such table: user_info (code 1)
2、删改查数据(AndroidRuntime)程序崩溃
android.database.sqlite.SQLiteException: no such table: user_info (code 1)
各参数说明
table:表名称
colums:列名称数组
selection:条件子句,相当于where
selectionArgs:条件语句的参数数组
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:
他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。
刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
提升自己去挑战一下BAT面试难关吧
对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
提升自己去挑战一下BAT面试难关吧
[外链图片转存中…(img-wtX9pbNT-1713776213245)]
对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!