安卓学习 之 数据存储(六)
一、文件存储
写入文件
- openFileOutput将数据存储到指定的文件当中去。第一个是文件名,第二个是文件的操作模式,MODE_PRIVATE为默认,会覆盖之前内容,MODE_APPEND会追加内容。默认存储到/data/data/pacak name/file下
- 获得FileOutputStream对象,借助他构建OutputStreamWriter对象,在构建BufferedWriter对象,使用Java流方式将其写到文件当中去。
- 输入结束关闭输入流。
public void save() {String data = "Data to save"; FileOutputStream out = null; BufferedWriter writer = null; try {out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(data);} catch (IOException e) { e.printStackTrace();} finally { try {if (writer != null) {writer.close();}} catch (IOException e) {e.printStackTrace()}}
}
读取文件
- openFileInput获得FileInputStream对象;
- 借助上一步结果构建InputStreamReader对象,在构建BufferedReader对象,再一行行构读取文本中的所有内容,存放至Stringbuilder对象中去。读取并返回,关闭Reader流。
- 关闭输入流。
public String load() { FileInputStream in = null; BufferedReader reader = null;StringBuilder content = new StringBuilder(); try {in = openFileInput("data");reader = new BufferedReader(new InputStreamReader(in)); String line = "";while ((line = reader.readLine()) != null){ content.append(line);}} catch (IOException e) { e.printStackTrace();} finally {if (reader != null) { try {reader.close();} catch (IOException e){ e.printStackTrace();}}}return content.toString();
}
二、SharedPreferences存储
将数据存储至SharedPreferences中
- 使用三种方法获得SharedPreferences对象,
- 第一种是Context 类中的 getSharedPreferences()方法,参数是文件名和指定的操作模式;
- 第二种Activity 类中的getPreferences(),只有一个参数操作模式;自动将当前活动的类名作为 SharedPreferences 的文件名。
- 第三种是PreferenceManager 类中的 getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名。
- SharedPreferences的edit方法获取editor对象。
- 在Editor对象中添加数据,比如添加布尔类型putBoolean,添加字符串putString
- 将添加的数据进行提交commit()。
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
从 SharedPreferences 中读取数据
- getSharedPreferences获得sharedPreferences对象;
- etString、getInt获得相应数值,若没有,则用后面的默认值替代.
SharedPreferences pref = getSharedPreferences("data",
MODE_PRIVATE);
String name = pref.getString("name", "");
三、SQLite
轻量级关系型数据库,速度快,占用资源少,遵循数据库ACID事务。
创建数据库
- 创建MyDatabaseHelper继承自SQLiteHelper,创建数据库的语句,将建表语句定义成字符串常量。
public class MyDatabaseHelper extends SQLiteOpenHelper{public static final String CREATE_BOOK = "create table Book("+"id integer primary key autoincrement,"+"author text,"+"price real,"+"pages integer,"+"name text)";
}
- 在onCreate调用SQLiteDatabase的execSQL执行这条建表语句.
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
升级数据库
在Book表基础之上再添加Category表;如果在oncreate()方法直接添加,会因为Book表已经存在而错误。
- 在onUpgrade中增加两条Drop语句,若存在则删除该表,并转而执行onCreate方法;
- 在onCreate方法中执行创表语句;
- dbHelper = new
MyDatabaseHelper(this,“BookStore.db”,null,2);将版本号改为比1大的。就能够触发oncreate()方法。
数据库操作
- 添加数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values); // 插入第一条数据
第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值 NULL
- 更新数据
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",10.99);
db.update("Book",values,"name=?",new String[]{"The Da Vinci Code"});
第三个参数对应SQL语句的where部分,表明更新所有name等于?的行,而?相当于一个占位符,第四个参数为占位符指定的内容。
- 删除数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages>?",new String[]{"500"});
- 查询数据
较为复杂,总共七个参数
query()方法参数 | 对应 SQL 部分 | 描述 |
---|---|---|
table | from table_name | 指定查询的表名 |
columns | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定 where 的约束条件 |
selectionArgs | - | 为 where 中的占位符提供具体的值 |
groupBy | group by column | 指定需要 group by 的列 |
having | having column = value | 对 group by 后的结果进一步约束 |
orderBy | order by column1, column2 | 指定查询结果的排序方式 |
- db.query(“Book”,null…)查询Book表中的所有数据,并将数据以Cursor对象进行返回。
- 将数组指针通过moveToFirst移到第一行的位置。
- 遍历Cursor对象,取出数据并打印,通过getColumnIndex获取某一列在表中对应的位置索引,然后将这索引传入到相应的取值方法中,这样便可以得到从数据库中读取到的数据了。
- Log输出。moveToNext获取下一条数据。
- 调用Close方法来关闭Cursor流。
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询Book表中所有的数据
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {do {// 遍历Cursor对象,取出数据并打印String name = cursor.getString(cursor. getColumnIndex("name"));String author = cursor.getString(cursor. getColumnIndex("author"));int pages = cursor.getInt(cursor.getColumnIndex("pages"));double price = cursor.getDouble(cursor.getColumnIndex("price"));Log.d("MainActivity", "book name is " + name); Log.d("MainActivity", "book author is " + author); Log.d("MainActivity", "book pages is " + pages); Log.d("MainActivity", "book price is " + price);} while (cursor.moveToNext());
}
cursor.close();
安卓学习 之 数据存储(六)相关推荐
- 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式
安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...
- 复杂存储过程学习_AI数据存储设备选型的6个关键要素
人工智能(AI)和机器学习将成为帮助企业利用其核心数字资产创造竞争优势的最重要工具之一.但在选购AI数据存储设备之前,企业必须考虑机器学习平台在获取.处理和保留数据时的一系列需求. 我们首先需要研究一 ...
- R语言学习丨数据存储文件格式知识,CSV,EXCEL,XML,JSON,MYSQL等
今天笔记的主要学习内容是R语言里文件相关知识,包含CSV.Excel.XML.JSON.MySQL等. CSV文件 基本介绍 CSV(Comma-Separated Values,字符分隔值,分隔字符 ...
- Python学习之数据存储
一.csv写入与读取(csv模块) 1.csv写入的步骤 import csv csv_file = open('demo.csv','w',newline='') writer = csv.writ ...
- 数据存储与访问之——初见SQLite数据库
本节引言: 本节我们继续来学习Android数据存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同, 我们并不需要在手机上另外安装一个数据库软件,Android系统已经集成了这个数据 ...
- IOS数据存储之文件沙盒存储
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...
- Android数据存储——2.文件存储_B_资源文件
今天学习Android数据存储--文件存储_资源文件 把资源文件mybook.txt放入项目目录下的res资源文件夹下的raw文件夹下(没有则新建),PS:mybook.txt存为UTF-8编码. X ...
- Android数据存储——2.文件存储_C_DOM解析XML文档
今天学习Android数据存储--文件存储_DOM解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效 ...
- 微信小程序数据存储长时间缓存数据,数据存储本地
安卓和小程序体验 小程序体验 安卓版本体验 安卓体验download 数据存储 使用场景 许多时候我们需要将用户的数据保存到本地,以便以后的调用.比如说openid,如果每次打开小程序都需要发送cod ...
最新文章
- Oracle事务和常用数据库对象
- Android点击事件之多点触摸与手势识别
- buu 篱笆墙的影子
- vuex状态管理模式:入门demo(状态管理仓)
- 如何处理高并发情况下的DB插入
- DataWorks功能实践速览
- Halcon自定义函数封装方法(全网最详细)
- 前魅族李楠创办“怒喵科技”,网友:看半天不知道公司干嘛的
- Qt自定义委托在QTableView中绘制控件、图片、文字
- 关于秒杀的系统架构优化思路
- DriverManager 连接不同的连接池
- java中this有什么作用_Java中this有什么用
- 优秀在线答题小程序汇总分享
- 网上一好人收集的PDF制作软件大全
- 推荐几款常用在线代码转换工具
- 使用JS实现对页面的繁体简体翻译转换
- 最全的程序化交易模型设计思路在这里
- 安卓投屏助手(B1425)
- 小程序开发外包公司哪家好?
- 夏敏捷第28本著作《Flash ActionScript3.0动画基础与游戏设计》(Flash CC版)
热门文章
- gSOAP中内存的使用
- QUIC 之类的可靠传输协议
- OkHttp3的连接池及连接建立过程分析
- 如何选择适合自己网站的防盗链
- (RabbitMQ) Java Client API Guide
- 设计模式:命令模式(Command)
- undefined reference to `boost::system::generic_category()
- YOLO (You only look once) 实时目标检测
- Actor并发模型入门
- 网络抓包工具 wireshark教程