第一行代码笔记3:数据存储
2015-03-10 19:44
281 查看
三种存储方式:文件、SharedPreference、数据库。
一、文件存储
不对存储内容进行任何格式化处理,所有数据都是原封不动保存到文件中,比较适于存储简单的文本数据或二进制数据。
1、将数据存储到文件中
context的openFileOutput()返回FileOutputStream对象。再构建一个OutputStreamWriter对象,接着使用OutputStreamWriter构建一个BufferedWriter对象。然后调用write()就行了,最后记得关闭BufferedWriter。
2、从文件中读取数据
context还提供了一个openFileInput(),用于从文件中读取数据,返回一个FileInputStream对象。用FileInputStream构建一个InputStreamReader对象,再用InputStreamReader构建一个BufferedReader对象,读取数据,读取完成记得关闭BufferedReader。
二、SQLite数据库
1、创建数据库
SQLiteOpenHelper可以方便的对数据库进行创建和升级。
getReadableDatabase()和getWritableDatabase()都可以创建或打开一个现有的数据库(若数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()返回的对象将以只读的方式去打开数据库,而getWritableDatabase()则将出现异常。
2、升级数据库
当数据库已经存在时,再创建新表是不会创建成功的。解决方法:在onUpgrade()中先将两张表删除,再调用onCreate()重新创建。因为创建表时如果发现这张表已经存在,就会直接报错。最后想办法让onUpdate()能够执行,创建数据库时传入的版本号,只要传入一个比之前版本号大的数,就可让onUpdate()执行了。代码见上。
3、添加数据
对数据的操作无非四种,即CUID。Create、Retrieve、Update、Delete。
SQLiteDatabase提供了一个inset(),专门用于添加数据。第一个参数是表名,第二个参数用于在未指定数据的情况下给某些可为空的列自动赋值NULL,一般用不到,直接传入null即可,第三个参数是一个ContentValues对象,它提供了一系列的put()重载。
4、更新数据
update()第一个参数是表名;第二个参数是ContentValues对象;第三、四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
第三个参数对应SQL的where部分,表示去更新所有name等于?的行,而?代表一个占位符,可通过第四个参数指定占位符的实际内容。因此上述代码想表达的是:将名字是The Da Vinci Code的这本书价格改成10.99。
5、删除数据
delete()第一个参数是表名,第二和三个参数用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
6、查询数据
query()第一个参数是表名;第二个参数用于指定去查询哪几列,不指定的话查询所有列;第三、四个参数用于去约束查询某一行或某几行的数据,不指定默认查询所有行;第五个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤;第七个参数用于指定查询结果的排序方式。
7、使用SQL操作数据库
添加数据的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查询数据的方法如下:
db.rawQuery("select * from Book", null);
一、文件存储
不对存储内容进行任何格式化处理,所有数据都是原封不动保存到文件中,比较适于存储简单的文本数据或二进制数据。
1、将数据存储到文件中
context的openFileOutput()返回FileOutputStream对象。再构建一个OutputStreamWriter对象,接着使用OutputStreamWriter构建一个BufferedWriter对象。然后调用write()就行了,最后记得关闭BufferedWriter。
public void save(String inputText) { FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }
2、从文件中读取数据
context还提供了一个openFileInput(),用于从文件中读取数据,返回一个FileInputStream对象。用FileInputStream构建一个InputStreamReader对象,再用InputStreamReader构建一个BufferedReader对象,读取数据,读取完成记得关闭BufferedReader。
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(); }
二、SQLite数据库
1、创建数据库
SQLiteOpenHelper可以方便的对数据库进行创建和升级。
getReadableDatabase()和getWritableDatabase()都可以创建或打开一个现有的数据库(若数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()返回的对象将以只读的方式去打开数据库,而getWritableDatabase()则将出现异常。
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)"; public static final String CREATE_CATEGART = "create table Category(" + "id integer primary key autoincrement, " + "catetory_name text, " + "category_code integer)"; private Context mContext; public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGART); Toast.makeText(mContext, "create succeeded", Toast.LENGTH_LONG).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }
public class MainActivity extends BaseActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); <span style="white-space:pre"> </span><span style="color:#ff0000;">//第二个参数是数据库名;第三个参数允许我们在查询数据时返回一个自定义的Cursor,一般传入null;第四个参数表示当前数据库的版本号</span> dbHelper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 1); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } }
2、升级数据库
当数据库已经存在时,再创建新表是不会创建成功的。解决方法:在onUpgrade()中先将两张表删除,再调用onCreate()重新创建。因为创建表时如果发现这张表已经存在,就会直接报错。最后想办法让onUpdate()能够执行,创建数据库时传入的版本号,只要传入一个比之前版本号大的数,就可让onUpdate()执行了。代码见上。
3、添加数据
对数据的操作无非四种,即CUID。Create、Retrieve、Update、Delete。
SQLiteDatabase提供了一个inset(),专门用于添加数据。第一个参数是表名,第二个参数用于在未指定数据的情况下给某些可为空的列自动赋值NULL,一般用不到,直接传入null即可,第三个参数是一个ContentValues对象,它提供了一系列的put()重载。
btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /*Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE"); sendBroadcast(intent);*/ SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "The Da Vinci Code"); values.put("author", "mwj"); db.insert("Book", null, values); values.clear(); values.put("name", "The Lost Symbol"); values.put("author", "wyx"); db.insert("Book", null, values); } });
4、更新数据
update()第一个参数是表名;第二个参数是ContentValues对象;第三、四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price", 10.99); db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });
第三个参数对应SQL的where部分,表示去更新所有name等于?的行,而?代表一个占位符,可通过第四个参数指定占位符的实际内容。因此上述代码想表达的是:将名字是The Da Vinci Code的这本书价格改成10.99。
5、删除数据
delete()第一个参数是表名,第二和三个参数用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
deleteButton.setOnClickListener(new OnClickListener() { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void onClick(View v) { <span style="white-space:pre"> </span>SQLiteDatabase db = dbHelper.getWritableDatabase(); <span style="white-space:pre"> </span>db.delete("Book", "pages > ?", new String[] { "500" }); <span style="white-space:pre"> </span>} });
6、查询数据
query()第一个参数是表名;第二个参数用于指定去查询哪几列,不指定的话查询所有列;第三、四个参数用于去约束查询某一行或某几行的数据,不指定默认查询所有行;第五个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤;第七个参数用于指定查询结果的排序方式。
queryButton.setOnClickListener(new OnClickListener() { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void onClick(View v) { <span style="white-space:pre"> </span>SQLiteDatabase db = dbHelper.getWritableDatabase(); <span style="white-space:pre"> </span>// 查询Book表中所有的数据 <span style="white-space:pre"> </span>Cursor cursor = db.query("Book", null, null, null, null, null, null); <span style="white-space:pre"> </span>if (cursor.moveToFirst()) { <span style="white-space:pre"> </span>do { <span style="white-space:pre"> </span>// 遍历Cursor对象,取出数据并打印 <span style="white-space:pre"> </span>String name = cursor.getString(cursor. <span style="white-space:pre"> </span>getColumnIndex("name")); <span style="white-space:pre"> </span>String author = cursor.getString(cursor. <span style="white-space:pre"> </span>getColumnIndex("author")); <span style="white-space:pre"> </span>int pages = cursor.getInt(cursor.getColumnIndex("pages")); <span style="white-space:pre"> </span>double price = cursor.getDouble(cursor.getColumnIndex("price")); <span style="white-space:pre"> </span>} while (cursor.moveToNext()); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>cursor.close(); <span style="white-space:pre"> </span>} });最后记得关闭Cursor。
7、使用SQL操作数据库
添加数据的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查询数据的方法如下:
db.rawQuery("select * from Book", null);
相关文章推荐
- Android第一行代码学习笔记四----数据存储
- 第一行代码笔记,第六章-----详解数据存储
- 第一行代码笔记 数据存储全方案
- 《第一行代码--Android》读书笔记之数据存储
- 第一行代码-第6章 数据存储方案,持久化技术
- 【第一行代码】Android数据存储
- [Android][第一行代码][第 6 章 数据存储]
- 第一行代码笔记 跨程序共享数据 content provider
- 数据存储之SharedPreferences存储——第一行代码Android学习笔记
- 第一行代码 第六章 数据储存方案 - SQLite数据库存储
- 第一行代码 第六章 数据储存方案 - LitePal数据库存储
- 第一行代码 第六章 数据储存方案 - 文件存储
- 【第一行代码-Android】学习(一)及在studio的迁移(5)存储数据
- 数据存储之SQLite 数据库存储——第一行代码Android学习笔记
- 数据存储之文件存储——第一行代码Android学习笔记
- 安卓第一行代码之数据存储
- 工作笔记 - 在VISTA中禁止向USB存储设备中写数据
- SilverLight学习笔记--本地(客户端)数据存储
- WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证
- SilverLight学习笔记--本地(客户端)数据存储