阅读《第一行代码》笔记
一. 文本操作
使用context. openFileOutput输出数据到文本,使用context.openFileInput读取文本。
FileOutputStream out = null;
BufferedWriter writer = null;
try {
// data 是文本的名称,会在/data/data/包名/file/ 下新建data文件
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();
}
}
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();
}
}
//content就是最后读取的数据
二.SharedPreferences
SharedPreferences是使用键值对的方式来存储数据的。
SharedPreferences 文件都是存放在/data/data/
Context.getSharedPreferences()
Activity类的 getPreferences()
PreferenceManager类中的 getDefaultSharedPreferences()方法
向sharedPreferences中存入数据
SharedPreferences.Editor editor=getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
从sharedPreferences中读取数据
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
String name = pref.getString("name", "");
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
三. SQLite数据库读取
数据库文件会存放在/data/data/
创建DatabaseHelper,google要求使用SQLiteOpenHelper来管理sqlite数据库,SQLiteOpenHelper是一个抽象类,有两个抽象方法,分别是 onCreate()和 onUpgrade()。 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)";
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);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
通过SQLiteOpenHelper可以获取到数据库的读写权限。
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
dbHelper.getWritableDatabase();
当一个应用新建了一个数据库后,数据库中也存在表时SQLiteOpenHelper将不会再去调用onCreate方法,如果已经新建了数据库,但是想删除数据库重新建一个的话,可以调用onUpgrade
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book"); //book是表名
db.execSQL("drop table if exists Category"); //Category是表名
onCreate(db);
}
/*2是数据库版本号,如果第一次传入的是1,第二次传入2的话,相当于版本更新了,SQLiteOpenHelper就会执行onUpgrade
*/
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
dbHelper.getWritableDatabase();
如果第一次创建了book表,第二次想创建Category表,则可以直接在onUpgrade中加入创建Category表的命令,如下:
public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement, " + "category_name text, " + "category_code integer)";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(CREATE_CATEGORY);
}
//执行以下代码
mySQLiteOpenHelper = new MySQLiteOpenHelper(this,"sqliteDemo.db",null,2); //版本号高于1
mySQLiteOpenHelper.getWritableDatabase();
结果如下:
补充:
如果想手动查看sqlite数据库的话,可以按如下步骤
1. root手机
2. 不进入adb shell
3. adb pull /data/data/程序包名/databases/数据库名称.db 电脑需要存放的路径
4. 使用可以查看db文件的软件直接打开,如SQLiteSpy
想查看手机中新建的数据库文件的话
1. adb shell
2. cd /data/data/程序包名/databases/
3. ls 查看
//使用sql语句操作sqlite数据库
db.execSQL("insertintoBook(name,author,pages,price)values(?,?,?,?)", new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" }); db.execSQL("insertintoBook(name,author,pages,price)values(?,?,?,?)", newString[] { "The Lost Symbol","Dan Brown", "510", "19.95" });
更新数据的方法如下:
db.execSQL("updateBooksetprice=? wherename=?",new String[]{"10.99", "The Da Vinci Code" }); 删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查询数据的方法如下:
db.rawQuery("select * from Book", null);
SQLite数据库事物处理,如果事物处理成功则db.setTransactionSuccessful(); ,如果事物处理失败,db.endTransaction();此时,事物之间的所有操作取消。
SQLiteDatabase db = dbHelper.getWritableDatabase();
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(); // 结束事务
}