1.文件 1)保存到手要内存,文件保存到/data/data对应的应用程序包下面 如 FILE_PATH = "/data/data/com.diysoul.filedemo/info.dat" 可通过Context的方法取得包名对应的文件夹来保存文件 /data/data/包名/files/ File fileDir = getFilesDir(); /data/data/包名/cache/ getCacheDir(); 再加入文件名来保存文件 File filePath = new File(fileDir, "info.dat"); 存储 FileOutputStream fos = new FileOutputStream(FILE_PATH); fos.write(stringInput.getBytes()); fos.flush(); fos.close(); 读取 FileInputStream fis = new FileInputStream(FILE_PATH); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); String strInfo = reader.readLine(); 2)保存到SD卡 存储和读取SD卡中的数据需要配置权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 首先取得SD卡的状态 String state = Environment.getExternalStorageState(); if(!Environment.MEDIA_MOUNTED.equals(state)) { return ""; } 取得SD卡的位置 File fileSDCard = Environment.getExternalStorageDirectory(); 创建文件 File file = new File(fileSDCard, FILE_NAME); 存储 FileOutputStream fos = new FileOutputStream(file); fos.write(stringInput.getBytes()); fos.flush(); fos.close(); 读取 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); reader.readLine(); 3).使用Context的方法保存文件 相关方法在 /data/data/包名/files/ 下创建文件 FileOutputStream fos = context.openFileOutput(FILE_NAME, mode); FileInputStream fis = context.openFileInput(FILE_NAME); FILE_NAME用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android会自动创建它。创建的文件保 存在/data/data/<package name>/files目录 mode指定用于指定操作模式, Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖 原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 如果希望文件被其他应用读和写,可以传入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); 注意:1).模拟器如果未指定SD卡的大小,则state将返回removed,表示没有SD卡! 2).android文件权限在DDMS中可以看到 android文件权限 - --- --- --- 第1位:d为文件夹,-为普通文件,l为挂载某一个文件 第2-4位:代表当前用户的权限,如 rw- = 110 = 6 第5-7位:代表当前用户所在组的其它组员的权限 第8-10位:代表所有的权限 ---没有任何权限,r--可读,-w-可写,rw-可读可写,--x可执行 2.使用SharedPreferences对象 创建文件时默认会添加后缀名xml 存储 // 文件保存在 /data/data/包名/shared_prefs/ SharedPreferences sharePreference = context.getSharedPreferences( FILE_NAME, Context.MODE_APPEND); // 取得Editor对象 Editor editor = sharePreference.edit(); // 写入数据 editor.putString(INFO, stringInput); // 提交,保存到物理磁盘 editor.commit(); 读取 // 文件保存在 /data/data/包名/shared_prefs/ SharedPreferences sharePreference = context.getSharedPreferences(FILE_NAME, Context.MODE_APPEND); // 读数据 String result = sharePreference.getString(INFO, ""); 权限同上 3.数据库SQLite3 1).通过继承SQLiteOpenHelper类开发子类,使用getReadableDatabase和getWritableDatabase方法取得数据库对象,操作数据库。开发者需要做的只是重写两个方法即可。
1 package com.diysoul.sqlitedemo.db; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 7 /** 8 * @author John 数据库帮助类,用于创建和管理数据库 9 */10 public class MySqliteHelper extends SQLiteOpenHelper {11 12 /**13 * 数据库文件名称14 */15 private static String stringName = "Person.db";16 17 /**18 * 数据库版本号,不能小于119 */20 private static int version = 1;21 22 /**23 * @param context24 * 上下文25 * @param name26 * 数据库文件名27 * @param factory28 * 游标工厂29 * @param version30 * 版本号31 */32 public MySqliteHelper(Context context) {33 super(context, stringName, null, version);34 }35 36 /**37 * 数据库创建时的回调方法,初始化表38 */39 @Override40 public void onCreate(SQLiteDatabase db) {41 // 操作数据库42 //1.创建表43 String sql = "create table person(_id integer primary key autoincrement, name varchar(20), age interger);";44 db.execSQL(sql);45 //AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table person(id interger primary key autoincrement, name varchar(20), age interger);46 47 }48 49 /**50 * 数据库版本号更新时回调此方法,更新数据库的内容,包括增加表,删除表,或修改表51 */52 @Override53 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {54 }55 56 }
对于sql语句,在java代码中无法检查出错误,可以在PC端数据库软件SQLite Expert Personal 3(百度盘有备份)中运行,确认没有问题再添加到代码中,将需要动态传入的参数用‘?’代替,加入参数即可。
// 1.创建表 create table person(_id integer primary key autoincrement, name varchar(20), age interger); // 2.插入数据 insert into person(name, age) values('lsi', 24); insert into person(name, age) values('王二', 24); db.execSQL("insert into person(name, age) values(?, ?);", new Object[] { person.getName(), person.getAge() }); // 3.删除数据 delete from person where _id = 2; db.execSQL("delete from person where _id = ?;", new Object[] { id }); // 4.更新数据 update person set name = 'tt' where name = '王二' update person set name = 'zhangshan' where name = 'tt' db.execSQL("update person set name = ?, age = ? where _id = ?;", new Object[] { person.getName(), person.getAge(), person.getId() }); // 5.查询数据 select * from person; select * from person where _id > 2; Cursor cursor = db.rawQuery("select _id, name, age from person;", null); Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;", new String[] { String.valueOf(id) }); 通过cursor读出需要的数据 if (cursor != null && cursor.getCount() > 0) { int id; String name; int age; while (cursor.moveToNext()) { id = cursor.getInt(0);// 第0列 对应 _id name = cursor.getString(1); // 第1列 对应 name age = cursor.getInt(2); // 第2列 对应 age list.add(new Person(id, name, age)); } } //查询一条语句 if (cursor != null && cursor.moveToFirst()) { id = cursor.getInt(0); // 对应 _id String name = cursor.getString(1); // 对应 name int age = cursor.getInt(2); // 对应 age person = new Person(id, name, age); } db对象: MySqliteHelper mySqlHelper; SQLiteDatabase db = mySqlHelper.getWritableDatabase(); //注意,每一次操作之后都需要关闭数据库 db.close();