数据存储技术
2015-11-08 16:14
176 查看
一、文件存储
1,使用java I/O技术完成存储
1)、保存string到默认路径data文件中
2)、从data文件读取数据,返回string
3)、点击EditText区域以外关闭输入法的方法
二、SharedPreferences存储
1、获取SharedPreferences对象,有3种方式
1)、Context 类中的getSharedPreferences()方法
2)、Activity 类中的getPreferences()方法
3)、PreferenceManager 类中的getDefaultSharedPreferences()方法
2、调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象,再向SharedPreferences.Editor 对象中添加数据,最后调用commit()方法将添加的数
据提交,保存位置默认。代码如下
3、读取内容代码如下
三、数据库存储
1、SQL基础
1)、数据类型:integer、real、text、blob
2)、建表语句
creat table Book(
id integer primary key autoincrement,
author text,
price real,
page integer,
name text)
2、创建数据库
1)、继承SQLiteOpenHelper类封装对数据库的创建升级操作,需要重写4参数构造器,实现抽象方法onCreate()和onUpGrade(),注意inCreat()方法在只在建数据库时会自动调
用
2)、在活动中构建出SQLiteOpenHelper 的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库
3)、查看数据库文件
3、升级数据库
1)、在现有数据库中加入新表,需要添加建表语句,并在inCreate()方法中调用之
2)、在onUPgrade()方法中添加如下语句,同时,主活动建数据库语句版本号参数改大。注意此方式会删掉旧表数据
4、添加数据
1)、主活动中获取数据库实例,定义数据容器组装数据,使用inser()方法添加至数据库,清空容器再重新组装。注意组装要与建表字段顺序一致
5、修改数据
1)、upDate()方法:接收4个参数,第一个为表名,第2个为数据容器,第三个为where,第四个提供字符数组匹配占位符,默认则修改所有。ContentValues使用与上例类似
6、删除数据
1)、delete()方法:接收3个参数,没有数据参数
7、查询数据
1)、query()方法:返回一个Cursor对象,最简单的一个重载方法接收7个参数,第一个为表名,第二个为列名,第三、四制定约束条件,第五指定要group by的列,第六对第
五的结果约束,第七指定查询结果的排序方式。注意Cursor使用后要关闭。
8、直接使用SQL执行数据操作
9、使用事物
1)、SQLite支持事物,保证一系列操作可以合并,要么都完成,要么一个都不做。
SQLiteDatabase db = dbHelper.getReadableDatabase();
db.beginTransaction(); // 开启事务
try {
db.delete("Book", null, null);
// if (true) {
// 在这里模拟一次失败,手动抛出一个异常,让事务失败
// throw new NullPointerException();
// }
ContentValues values = new ContentValues();
values.put("name", "Game of Thrones");
values.put("author", "George Martin");
values.put("pages", 720);
values.put("price", 20.85);
db.insert("Book", null, values);
db.setTransactionSuccessful(); // 事务已经执行成功
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction(); // 结束事务
}
10、升级数据库优化
1)、3中提供了一种数据库升级方案,但是在升级时删除旧表会导致原有数据丢失,下例在onUpGrade()方法中使用switch语句,case为原始版本号,其中添加升级要执行的语
句,表示从旧版本升级到新版本需要执行的变更;同时在onCreate()方法中执行历次更新执行的语句,保证首次安装也可以创建成最新版本
public void onCreate(SQLiteDatabase db) {
// 建表
db.execSQL(CREAT_TABLE);
db.execSQL(CREATE_CATEGORY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
switch (oldVersion) {
case 1:
db.execSQL(CREATE_CATEGORY);
default:
}
}
2)、现要对上例2张表建立联系,在Book表中添加category_id 字
9d10
段,则在原Book建表语句中添加此字段,然后添加case项,添加相应SQL操作
public static final String CREAT_TABLE = "create table Book ("
+ "id integer primary key autoincrement, author text, "
+ "price real, pages integer, name text" + "category_id integer)";
1,使用java I/O技术完成存储
1)、保存string到默认路径data文件中
private void saveinput(String string) { // TODO Auto-generated method stub FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(string); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }
2)、从data文件读取数据,返回string
private 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(); }
3)、点击EditText区域以外关闭输入法的方法
public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; // 获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 点击的是输入框区域,保留点击EditText的事件 return false; } else { return true; } } return false; }
二、SharedPreferences存储
1、获取SharedPreferences对象,有3种方式
1)、Context 类中的getSharedPreferences()方法
2)、Activity 类中的getPreferences()方法
3)、PreferenceManager 类中的getDefaultSharedPreferences()方法
2、调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象,再向SharedPreferences.Editor 对象中添加数据,最后调用commit()方法将添加的数
据提交,保存位置默认。代码如下
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name", "Tom"); editor.putInt("age", 28); editor.putBoolean("married", false); editor.commit();
3、读取内容代码如下
StringBuffer stringBuffer = new StringBuffer(); SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE); stringBuffer.append("name is" + pref.getString("name", "") + "," + "age is" + pref.getInt("age", 0) + "," + "married is " + pref.getBoolean("married", false));
三、数据库存储
1、SQL基础
1)、数据类型:integer、real、text、blob
2)、建表语句
creat table Book(
id integer primary key autoincrement,
author text,
price real,
page integer,
name text)
2、创建数据库
1)、继承SQLiteOpenHelper类封装对数据库的创建升级操作,需要重写4参数构造器,实现抽象方法onCreate()和onUpGrade(),注意inCreat()方法在只在建数据库时会自动调
用
public class MyDataBaseHelper extends SQLiteOpenHelper { public static final String CREAT_TABLE = "creat table Book(" + "id integer primary key autoincrement," + "author text," + "price real," + "page integer," + "name text)"; public MyDataBaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // 执行建表语句 db.execSQL(CREAT_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { // TODO Auto-generated method stub } }
2)、在活动中构建出SQLiteOpenHelper 的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库
MyDataBaseHelper dbHelper = new MyDataBaseHelper( getApplicationContext(), "BookStore.db", null, 1); dbHelper.getReadableDatabase();
3)、查看数据库文件
//进入设备控制台 adb shell //进入数据库文件所在文件夹 cd data/data/com.study.hello/databases //查看此文件夹下的问价 ls //打开数据库文件 sqlite3 BookStore.db //查看数据库表 .table //查看建表语句 .schema<pre class="html" name="code"> //查看Book表内容 select * from Book;
3、升级数据库
1)、在现有数据库中加入新表,需要添加建表语句,并在inCreate()方法中调用之
public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement, category_name text, " + "category_code integer)";
db.execSQL(CREATE_CATEGORY);
2)、在onUPgrade()方法中添加如下语句,同时,主活动建数据库语句版本号参数改大。注意此方式会删掉旧表数据
db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
4、添加数据
1)、主活动中获取数据库实例,定义数据容器组装数据,使用inser()方法添加至数据库,清空容器再重新组装。注意组装要与建表字段顺序一致
SQLiteDatabase db = dbHelper.getReadableDatabase(); ContentValues values = new ContentValues(); // 开始组装第一条数据 values.put("author", "Dan Brown"); values.put("price", 16.96); values.put("pages", 454); values.put("name", "The Da Vinci Code"); db.insert("Book", null, values); // 插入第一条数据 values.clear(); // 开始组装第二条数据 values.put("author", "Dan Brown"); values.put("price", 19.95); values.put("pages", 510); values.put("name", "The Lost Symbol"); db.insert("Book", null, values); values.clear();
5、修改数据
1)、upDate()方法:接收4个参数,第一个为表名,第2个为数据容器,第三个为where,第四个提供字符数组匹配占位符,默认则修改所有。ContentValues使用与上例类似
values.put("price", 10.99); db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code"});
6、删除数据
1)、delete()方法:接收3个参数,没有数据参数
db.delete("Book", "name = ?", new String[] { "The Da Vinci Code"});
7、查询数据
1)、query()方法:返回一个Cursor对象,最简单的一个重载方法接收7个参数,第一个为表名,第二个为列名,第三、四制定约束条件,第五指定要group by的列,第六对第
五的结果约束,第七指定查询结果的排序方式。注意Cursor使用后要关闭。
Cursor cursor = db.query("Book", null, "price = ?", new String[] { "16.96" }, 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()); } else { Log.d("MainActivity", "Not Found"); } cursor.close();
8、直接使用SQL执行数据操作
9、使用事物
1)、SQLite支持事物,保证一系列操作可以合并,要么都完成,要么一个都不做。
SQLiteDatabase db = dbHelper.getReadableDatabase();
db.beginTransaction(); // 开启事务
try {
db.delete("Book", null, null);
// if (true) {
// 在这里模拟一次失败,手动抛出一个异常,让事务失败
// throw new NullPointerException();
// }
ContentValues values = new ContentValues();
values.put("name", "Game of Thrones");
values.put("author", "George Martin");
values.put("pages", 720);
values.put("price", 20.85);
db.insert("Book", null, values);
db.setTransactionSuccessful(); // 事务已经执行成功
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction(); // 结束事务
}
10、升级数据库优化
1)、3中提供了一种数据库升级方案,但是在升级时删除旧表会导致原有数据丢失,下例在onUpGrade()方法中使用switch语句,case为原始版本号,其中添加升级要执行的语
句,表示从旧版本升级到新版本需要执行的变更;同时在onCreate()方法中执行历次更新执行的语句,保证首次安装也可以创建成最新版本
public void onCreate(SQLiteDatabase db) {
// 建表
db.execSQL(CREAT_TABLE);
db.execSQL(CREATE_CATEGORY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
switch (oldVersion) {
case 1:
db.execSQL(CREATE_CATEGORY);
default:
}
}
2)、现要对上例2张表建立联系,在Book表中添加category_id 字
9d10
段,则在原Book建表语句中添加此字段,然后添加case项,添加相应SQL操作
public static final String CREAT_TABLE = "create table Book ("
+ "id integer primary key autoincrement, author text, "
+ "price real, pages integer, name text" + "category_id integer)";
<pre class="html" name="code"> public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub switch (oldVersion) { case 1: db.execSQL(CREATE_CATEGORY); case 2: db.execSQL("alter table Book add column category_id integer"); default: } }
相关文章推荐
- Unity3d通用工具类之数据配置加载类
- Android(10):时间与日期TimePicker、DatePicker、模拟时钟(非数字时钟)AnalogcClock
- 【Java】 变量和编译时类型和运行时类型不同
- <仅是自己做笔记。。。系列-12>输入一个表示整数的字符串,把该字符串转换成整数并输出。
- Unity3d通用工具类之数据配置加载类
- Java学习笔记(十)——多态
- android studio 如何设置代码区域的背景色
- 如何反编译APK?
- Android 效率开发之EventBus新使用方法
- 如何反编译APK?
- C#数组
- 冒泡冒泡冒泡
- oracle中的alter table语句
- gitlab服务器构建文章汇总
- java基于UDP协议的网络编程
- SpringMVC+kaptcha实现图形验证码
- Swift编程中的泛型解析
- POJ 3057 Evacuation(二分匹配)
- 20135210——信息安全系统设计基础第九周学习总结
- ServletContext对象常用操作