Flutter数据库的使用,推荐

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)');

});

复制代码




3.  增



在事务中向表中插入几条数据



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’);

});

复制代码




4.  删



删除表中的一条数据



count = await database

.rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);

复制代码




5.  改



修改表中的数据



int count = await database.rawUpdate(‘UPDATE Test SET name = ?, value = ? WHERE name = ?’,

['updated name', '9876', 'some name']);

print(‘updated: $count’);

复制代码




6.  查



查询表中的数据



// Get the records

List list = await database.rawQuery(‘SELECT * FROM Test’);

List expectedList = [

{‘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’));

复制代码




7.  关闭数据库



await database.close();

复制代码




8.  删除数据库



await deleteDatabase(path);

复制代码




### []( )使用SQL助手



1.  创建表中的字段及关联类



//字段

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;

}

}

复制代码




2.  使用上面的类进行创建删除数据库以及数据的增删改查操作。



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<Map> maps = await db.query(tableTodo,

    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();

}

复制代码




3.  查询表中的所有数据



List<Map<String, Object?>> records = await db.query(‘my_table’);

复制代码




4.  获取结果中的第一条数据



Map<String, Object?> mapRead = records.first;

复制代码




5.  上面查询结果的列表中Map为只读数据,修改此数据会抛出异常



mapRead[‘my_column’] = 1;

// Crash… mapRead is read-only

复制代码




6.  创建map副本并修改其中的字段



// 根据上面的map创建一个map副本

Map<String, Object?> map = Map<String, Object?>.from(mapRead);

// 在内存中修改此副本中存储的字段值

map[‘my_column’] = 1;

复制代码




7.  把查询出来的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],

);

});

复制代码




### []( )批处理



1.  您可以使用批处理来避免dart与原生之间频繁的交互。



batch = db.batch();

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

【Android高级架构视频学习资源】

;

复制代码




### []( )批处理



1.  您可以使用批处理来避免dart与原生之间频繁的交互。



batch = db.batch();

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
[外链图片转存中…(img-tBXDgF5n-1630845415300)]

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值