导入 sqflite.dart
import ‘dart:async’;
import ‘package:path/path.dart’;
import ‘package:sqflite/sqflite.dart’;
复制代码
打开数据库
SQLite数据库就是文件系统中的文件。如果是相对路径,则该路径是getDatabasesPath()所获得的路径,该路径关联的是Android上的默认数据库目录和iOS上的documents目录。
var db = await openDatabase(‘my_db.db’);
复制代码
许多时候我们使用数据库时不需要手动关闭它,因为数据库会在程序关闭时被关闭。如果你想自动释放资源,可以使用如下方式:
await db.close();
复制代码
执行原始的SQL查询
- 使用getDatabasesPath()获取数据库位置
使用 sqflite package 里的 getDatabasesPath 方法并配合 path package里的 join 方法定义数据库的路径。使用path包中的join方法是确保各个平台路径正确性的最佳实践。
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, ‘demo.db’);
复制代码
- 打开数据库
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
// 创建数据库时创建表
await db.execute(
‘CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)’);
});
复制代码
- 增
在事务中向表中插入几条数据
await database.transaction((txn) async {
int id1 = await txn.rawInsert(
‘INSERT INTO Test(name, value, num) VALUES(“some name”, 1234, 456.789)’);
print(‘inserted1: $id1’);
int id2 = await txn.rawInsert(
‘INSERT INTO Test(name, value, num) VALUES(?, ?, ?)’,
[‘another name’, 12345678, 3.1416]);
print(‘inserted2: $id2’);
});
复制代码
- 删
删除表中的一条数据
count = await database
.rawDelete(‘DELETE FROM Test WHERE name = ?’, [‘another name’]);
复制代码
- 改
修改表中的数据
int count = await database.rawUpdate(‘UPDATE Test SET name = ?, value = ? WHERE name = ?’,
[‘updated name’, ‘9876’, ‘some name’]);
print(‘updated: $count’);
复制代码
- 查
查询表中的数据
// Get the records
List
List
{‘name’: ‘updated name’, ‘id’: 1, ‘value’: 9876, ‘num’: 456.789},
{‘name’: ‘another name’, ‘id’: 2, ‘value’: 12345678, ‘num’: 3.1416}
];
print(list);
print(expectedList);
复制代码
查询表中存储数据的总条数
count = Sqflite.firstIntValue(await database.rawQuery(‘SELECT COUNT(*) FROM Test’));
复制代码
- 关闭数据库
await database.close();
复制代码
- 删除数据库
await deleteDatabase(path);
复制代码
使用SQL助手
- 创建表中的字段及关联类
//字段
final String tableTodo = ‘todo’;
final String columnId = ‘_id’;
final String columnTitle = ‘title’;
final String columnDone = ‘done’;
//对应类
class Todo {
int id;
String title;
bool done;
//把当前类中转换成Map,以供外部使用
Map<String, Object?> toMap() {
var map = <String, Object?>{
columnTitle: title,
columnDone: done == true ? 1 : 0
};
if (id != null) {
map[columnId] = id;
}
return map;
}
//无参构造
Todo();
//把map类型的数据转换成当前类对象的构造函数。
Todo.fromMap(Map<String, Object?> map) {
id = map[columnId];
title = map[columnTitle];
done = map[columnDone] == 1;
}
}
复制代码
- 使用上面的类进行创建删除数据库以及数据的增删改查操作。
class TodoProvider {
Database db;
Future open(String path) async {
db = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(‘’’
create table $tableTodo (
$columnId integer primary key autoincrement,
$columnTitle text not null,
$columnDone integer not null)
‘’');
});
}
//向表中插入一条数据,如果已经插入过了,则替换之前的。
Future insert(Todo todo) async {
todo.id = await db.insert(tableTodo, todo.toMap(),conflictAlgorithm: ConflictAlgorithm.replace,);
return todo;
}
Future getTodo(int id) async {
List
columns: [columnId, columnDone, columnTitle],
where: ‘$columnId = ?’,
whereArgs: [id]);
if (maps.length > 0) {
return Todo.fromMap(maps.first);
}
return null;
}
Future delete(int id) async {
return await db.delete(tableTodo, where: ‘$columnId = ?’, whereArgs: [id]);
}
Future update(Todo todo) async {
return await db.update(tableTodo, todo.toMap(),
where: ‘$columnId = ?’, whereArgs: [todo.id]);
}
Future close() async => db.close();
}
复制代码
- 查询表中的所有数据
List<Map<String, Object?>> records = await db.query(‘my_table’);
复制代码
- 获取结果中的第一条数据
Map<String, Object?> mapRead = records.first;
复制代码
- 上面查询结果的列表中Map为只读数据,修改此数据会抛出异常
mapRead[‘my_column’] = 1;
// Crash… mapRead
is read-only
复制代码
- 创建map副本并修改其中的字段
// 根据上面的map创建一个map副本
Map<String, Object?> map = Map<String, Object?>.from(mapRead);
// 在内存中修改此副本中存储的字段值
map[‘my_column’] = 1;
复制代码
- 把查询出来的List< map>类型的数据转换成List< Todo>类型,这样我们就可以痛快的使用啦。
// Convert the List<Map<String, dynamic> into a List.
return List.generate(maps.length, (i) {
return Todo(
id: maps[i][columnId],
title: maps[i][columnTitle],
done: maps[i][columnDown],
);
});
复制代码
批处理
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
笔者之前工作是在金融公司可能并不是特别追求技术,而笔者又是喜欢追求技术的人,所以格格不入,只能把目标放在互联网大厂了。也希望大家都去敢于尝试和追逐自己的梦想!
BATJ大厂Android高频面试题
觉得有收获的记得点赞,关注+收藏哦!你们的点赞就是我的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-VfTQvLA8-1712843962397)]
总结
笔者之前工作是在金融公司可能并不是特别追求技术,而笔者又是喜欢追求技术的人,所以格格不入,只能把目标放在互联网大厂了。也希望大家都去敢于尝试和追逐自己的梦想!
BATJ大厂Android高频面试题
[外链图片转存中…(img-pRrEdQTi-1712843962397)]
[外链图片转存中…(img-2L645jQ2-1712843962398)]
[外链图片转存中…(img-anuaww7y-1712843962398)]
[外链图片转存中…(img-hggi1Dlm-1712843962398)]
觉得有收获的记得点赞,关注+收藏哦!你们的点赞就是我的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-4iLuHwcC-1712843962399)]