sdCard:默认路径在 /storage/sdcard/...
<!-- 允许用户创建和删除sdcard卡上的内容 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!-- 允许用户往sdcard卡上写入的内容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
为了能单元测试,必须在应用程序的清单文件中添加工具instrument并在清单文件应用标签中注册单元测试库(图形化界面添加方便)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_06storage"
android:versionCode=""
android:versionName="1.0" > <uses-sdk
android:minSdkVersion=""
android:targetSdkVersion="" />
<!-- 添加读写授权 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<instrumentation android:targetPackage="com.example.android_06storage" android:name="android.test.InstrumentationTestRunner"></instrumentation> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 添加 -->
<uses-library android:name="android.test.runner"/>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
读取sdCard代码:
package com.example.android_06storage; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.content.Context;
import android.os.Environment; public class FileService { private Context context;
public FileService() {
// TODO Auto-generated constructor stub
}
public FileService(Context context) {
// TODO Auto-generated constructor stub
this.context=context;
} /**
*
* @param fileName文件名
* @param Content文件内容
* @return
* @throws Exception
*/
public boolean saveContentToSdcard(String fileName,String Content) throws Exception{
boolean flag=false;
FileOutputStream fileOutputStream=null;
File file=new File(Environment.getExternalStorageDirectory(),fileName);
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
try {
fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(Content.getBytes());
flag=true;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if(fileOutputStream!=null)
fileOutputStream.close();
} }
return flag;
}
public String getDataFromSdcard(String fileName){
FileInputStream fileInputStream=null;
ByteArrayOutputStream out=new ByteArrayOutputStream();
File file=new File(Environment.getExternalStorageDirectory(),fileName);
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
try {
fileInputStream=new FileInputStream(file);
int len=;
byte[] data=new byte[];
while((len=fileInputStream.read(data))!=-){
out.write(data, , len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fileInputStream!=null)
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return new String (out.toByteArray()); }
}
测试类:
package com.example.android_06storage; import android.content.Context;
import android.test.AndroidTestCase;
import android.util.Log; public class myTest extends AndroidTestCase { private static final String TAG="myTest";
public myTest() {
// TODO Auto-generated constructor stub
} public void saveFile() throws Exception{
Context context=getContext();
FileService fileService=new FileService(context);
boolean flag=fileService.saveContentToSdcard("hello.txt", "你好 阳光");
System.out.println(flag);
Log.i(TAG, "---->>"+flag); }
public void readFile() throws Exception{
Context context=getContext();
FileService fileService=new FileService(context);
String msg=fileService.getDataFromSdcard("hello.txt");
System.out.println(msg);
Log.i(TAG, "---->>"+msg); }
}
读取raw文件夹中获取文件:InputStream in = getResources().openRawResource(R.raw.a);
读取asset文件夹中获取文件:
package com.example.android_06storage_sharedpreference; import java.util.HashMap;
import java.util.Map; import android.content.Context;
import android.content.SharedPreferences; public class SharedPreference { private Context context; public SharedPreference() {
// TODO Auto-generated constructor stub
} public SharedPreference(Context context) {
// TODO Auto-generated constructor stub
this.context=context;
}
public boolean SaveKVmessage(String name,String pwd){
boolean flag=false;
SharedPreferences share=context.getSharedPreferences("userinfo", context.MODE_PRIVATE);
//对数据进行编辑
SharedPreferences.Editor editor=share.edit();
editor.putString("name", name);
editor.putString("password", pwd);
//完成编辑将数据持久化存储到存储介质中
flag=editor.commit();
return flag;
}
public Map<String,Object> ReadKVmessage(){
Map<String,Object> map=new HashMap<String, Object>(); SharedPreferences share=context.getSharedPreferences("userinfo", context.MODE_PRIVATE); String name=share.getString("name", "");
String password=share.getString("password", ""); map.put("name", name);
map.put("password", password); return map;
}
}
测试类:
package com.example.android_06storage_sharedpreference; import java.util.Map; import android.content.Context;
import android.test.AndroidTestCase;
import android.util.Log; public class MyTest extends AndroidTestCase { private static final String TAG="MyTest";
public MyTest(){ }
public void save(){
Context context=getContext();
SharedPreference sharedPreference=new SharedPreference(context);
boolean flag=sharedPreference.SaveKVmessage("admin", "");
Log.i(TAG, "--->>"+flag);
}
public void Read(){
Context context=getContext();
SharedPreference sharedPreference=new SharedPreference(context);
Map<String,Object> map=sharedPreference.ReadKVmessage();
Log.i(TAG, "--->>"+map.toString());
}
}
SQLite数据库的存储:默认路径在 /data/data/...
SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
1、轻量级:SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也很小。
2、独立性:SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。
3、隔离性:SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台:SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口:SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6、安全性:SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
创建一个类,继承SQLiteOpenHelper
Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。
SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
构造函数,调用父类 SQLiteOpenHelper 的构造函数
onCreate()方法;// TODO 创建数据库后,对数据库的操作
onUpgrage()方法。// TODO 更改数据库版本的操作
当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
操作数据库的最佳实践是创建一个辅助类,例如联系人模块
class ContactsDatabaseHelper extends SQLiteOpenHelper
项目目录如下:
方法1:对于有sql经验的人而言,这种方式比较适合:
增删改 db.execSQL(sql) 查db.rawQuery(sql, params);
首先在db下创建一个DBOpenHelper类继承SQLiteOpenHelper
package com.example.android_06sotrage_sqlite.db; import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class DBOpenHelper extends SQLiteOpenHelper { private static String name="mydb.db";//数据库名称
private static int version=;//数据库版本号 public DBOpenHelper(Context context) {
super(context, name, null, version);
// TODO Auto-generated constructor stub
//虽然定义了数据库的名称和版本号,
//但直到调用getReadableDatabase或getWritableDatabase的时候才最终生成数据库 } /**
* 当数据库创建的时候 是第一次被执行
* 通常用来完成对数据库表的创建
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//支持的数据类型:整型数据 字符串 日期类型 二进制数据类型
String sql="create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
//原来版本创建时 是1 如果设置成>1的数字,则会更新数据库版本,这里只需要执行alter语句就行
String sql="alter table person add sex varchar(8)";
db.execSQL(sql);
} }
然后在service包下建接口类
package com.example.android_06sotrage_sqlite.service; import java.util.List;
import java.util.Map; public interface PersonService { public boolean add(Object[] params);
public boolean del(Object[] params);
public boolean mod(Object[] params);
public Map<String,String> find(String[] params);
public List<Map<String,String>> findMore(String[] params);
}
第三在dao包下建实现类
package com.example.android_06sotrage_sqlite.dao; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
import com.example.android_06sotrage_sqlite.service.PersonService; public class PersonDao implements PersonService { private DBOpenHelper helper=null;
public PersonDao(Context context) {
// TODO Auto-generated constructor stub
helper=new DBOpenHelper(context);
} @Override
public boolean add(Object[] params) {
// TODO Auto-generated method stub
boolean flag=false;
//SQLiteDatabase实现数据库的增删改
SQLiteDatabase database=null;
try {
String sql="insert into person(name,address) values(?,?)";
database=helper.getWritableDatabase();
database.execSQL(sql,params);
flag=true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public boolean del(Object[] params) {
// TODO Auto-generated method stub
boolean flag=false;
SQLiteDatabase database=null;
try {
String sql="delete from person where id=?";
database=helper.getWritableDatabase();
database.execSQL(sql,params);
flag=true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public boolean mod(Object[] params) {
// TODO Auto-generated method stub
boolean flag=false;
SQLiteDatabase database=null;
try {
String sql="update person set name=?,address=? where id=?";
database=helper.getWritableDatabase();
database.execSQL(sql,params);
flag=true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public Map<String, String> find(String[] params) {
// TODO Auto-generated method stub
Map<String, String> map=new HashMap<String, String>();
SQLiteDatabase database=null;
try {
String sql="select * from person where id=?";
database=helper.getReadableDatabase();
Cursor cursor=database.rawQuery(sql, params);
//数据库列的个数
int col=cursor.getColumnCount();
while(cursor.moveToNext()){
for (int i = ; i < col; i++) {
String col_name=cursor.getColumnName(i);
String col_val=cursor.getString(cursor.getColumnIndex(col_name));
if(col_val==null)
col_val="";
map.put(col_name, col_val);
} }
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return map;
} @Override
public List<Map<String, String>> findMore(String[] params) {
// TODO Auto-generated method stub
List<Map<String, String>> list=new ArrayList<Map<String,String>>();
SQLiteDatabase database=null;
try {
String sql="select * from person";
database=helper.getReadableDatabase();
Cursor cursor=database.rawQuery(sql, params);
//数据库列的个数
int col=cursor.getColumnCount();
while(cursor.moveToNext()){
Map<String, String> map=new HashMap<String, String>();
for (int i = ; i < col; i++) {
String col_name=cursor.getColumnName(i);
String col_val=cursor.getString(cursor.getColumnIndex(col_name));
if(col_val==null)
col_val="";
map.put(col_name, col_val);
}
list.add(map);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return list;
} }
最后创建测试类:
package com.example.android_06sotrage_sqlite.test; import java.util.List;
import java.util.Map; import com.example.android_06sotrage_sqlite.dao.PersonDao;
import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
import com.example.android_06sotrage_sqlite.service.PersonService; public class MyTest extends android.test.AndroidTestCase{ public MyTest() {
// TODO Auto-generated constructor stub
} public void createDB(){
DBOpenHelper helper=new DBOpenHelper(getContext());
helper.getWritableDatabase();//此时才真正创建了数据库
}
public void add(){
PersonService service=new PersonDao(getContext());
Object[] params={"mlj","xinxiang"};
boolean flag=service.add(params);
System.out.println("--->>"+flag);
}
public void del(){
PersonService service=new PersonDao(getContext());
Object[] params={};
boolean flag=service.del(params);
System.out.println("--->>"+flag);
}
public void mod(){
PersonService service=new PersonDao(getContext());
Object[] params={"mlj","huojia",""};
boolean flag=service.mod(params);
System.out.println("--->>"+flag);
}
public void find(){
PersonService service=new PersonDao(getContext());
String[] params={""};
Map<String,String> map=service.find(params);
System.out.println("--->>"+map.toString());
}
public void findMore(){
PersonService service=new PersonDao(getContext());
List<Map<String,String>> list=service.findMore(null);
System.out.println("--->>"+list.toString());
}
}
方法2:对于其他人而言,这种方式比较适合,因为不用编写sql语句:
增 db.insert("表名", "列名", 值);
int insert(String table, String nullColumnHack, ContentValues values) 列名可以为空,当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),
为了防止这种情况,我们要在这里指定一个 列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。
值类似于map类型。
返回值为int,如果不等于-1,即表示成功插入
删 db.delete("表名", "不含where的条件字句", 字句中占位符的值);
int delete (String table, String whereClause, String[] whereArgs),返回值为最终影响的行数
改db.update("表名", 值,"不含where的条件字句", 字句中占位符的值);
int update (String table, ContentValues values, String whereClause, String[] whereArgs)返回值为最终影响的行数
查db.query(是否是唯一记录, "表名", 列名可以为空, 字句, 字句占位符的值, 分组可以为空, 过滤可以为空, 排序可以为空, 限制记录可以为空);
Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy,String limit)
DBOpenHelper类同上
新建接口类:
package com.example.android_06sotrage_sqlite.service; import java.util.List;
import java.util.Map; import android.content.ContentValues; public interface PersonService2 { public boolean add(ContentValues values);
public boolean del(String whereClause,String[] whereArgs);
public boolean mod(ContentValues values, String whereClause, String[] whereArgs);
public Map<String,String> find(String selection,String[] selectionArgs);
public List<Map<String,String>> findMore(String selection,String[] selectionArgs);
}
第三在dao包下建实现类:
package com.example.android_06sotrage_sqlite.dao; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
import com.example.android_06sotrage_sqlite.service.PersonService2; public class PersonDao2 implements PersonService2 { private DBOpenHelper helper=null;
public PersonDao2(Context context) {
// TODO Auto-generated constructor stub
helper=new DBOpenHelper(context);
} @Override
public boolean add(ContentValues values) {
// TODO Auto-generated method stub
boolean flag=false;
long id=-;//返回最终结果值 如果不等于-1,即表示成功插入
//SQLiteDatabase实现数据库的增删改
SQLiteDatabase database=null;
try {
database=helper.getWritableDatabase();
id=database.insert("person", null, values);
flag=(id!=-?true:false);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public boolean del(String whereClause,String[] whereArgs) {
// TODO Auto-generated method stub
boolean flag=false;
int count=;//最终影响的行数
SQLiteDatabase database=null;
try {
database=helper.getWritableDatabase();
count=database.delete("person", whereClause, whereArgs);
flag=(count>?true:false);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public boolean mod(ContentValues values, String whereClause, String[] whereArgs) {
boolean flag=false;
int count=;//最终影响的行数
SQLiteDatabase database=null;
try {
database=helper.getWritableDatabase();
count=database.update("person", values, whereClause, whereArgs);
flag=(count>?true:false);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return flag;
} @Override
public Map<String, String> find(String selection,String[] selectionArgs) {
// TODO Auto-generated method stub
Map<String, String> map=new HashMap<String, String>();
SQLiteDatabase database=null;
try {
database=helper.getReadableDatabase();
/**
* distinct 是否返回唯一值
* table name表名
* column name 设置为空 表明所有列
* selection
* selectionArgs
* groupBy null
* having null
* orderBy null
* limit null
*/
Cursor cursor=database.query(true, "person", null, selection, selectionArgs, null, null, null, null);
//数据库列的个数
int col=cursor.getColumnCount();
while(cursor.moveToNext()){
for (int i = ; i < col; i++) {
String col_name=cursor.getColumnName(i);
String col_val=cursor.getString(cursor.getColumnIndex(col_name));
if(col_val==null)
col_val="";
map.put(col_name, col_val);
}
} } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return map;
} @Override
public List<Map<String, String>> findMore(String selection,String[] selectionArgs) {
// TODO Auto-generated method stub
List<Map<String, String>> list=new ArrayList<Map<String,String>>();
SQLiteDatabase database=null;
try {
database=helper.getReadableDatabase();
Cursor cursor=database.query(false, "person", null, selection, selectionArgs, null, null, null, null);
//数据库列的个数
int col=cursor.getColumnCount();
while(cursor.moveToNext()){
Map<String, String> map=new HashMap<String, String>();
for (int i = ; i < col; i++) {
String col_name=cursor.getColumnName(i);
String col_val=cursor.getString(cursor.getColumnIndex(col_name));
if(col_val==null)
col_val="";
map.put(col_name, col_val);
}
list.add(map);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally{
if(database!=null)
database.close();
}
return list;
} }
最后创建测试类:
package com.example.android_06sotrage_sqlite.test; import java.util.List;
import java.util.Map; import android.content.ContentValues; import com.example.android_06sotrage_sqlite.dao.PersonDao2;
import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
import com.example.android_06sotrage_sqlite.service.PersonService2; public class MyTest2 extends android.test.AndroidTestCase{ public MyTest2() {
// TODO Auto-generated constructor stub
} public void createDB(){
DBOpenHelper helper=new DBOpenHelper(getContext());
helper.getWritableDatabase();//此时才真正创建了数据库
}
public void add(){
PersonService2 service=new PersonDao2(getContext());
ContentValues values=new ContentValues();//类似于map
values.put("name", "zhh");
values.put("address", "henan");
service.add(values);
boolean flag=service.add(values);
System.out.println("--->>"+flag);
}
public void del(){
PersonService2 service2=new PersonDao2(getContext());
/**
* whereClause 条件字句
* 原来sql语句是"delete from person where id=? "
* 现在的字句不包含where关键字
* whereArgs 字句中的参数列表
*/
boolean flag=service2.del("id=?", new String[]{""});
System.out.println("--->>"+flag);
}
public void mod(){
PersonService2 service2=new PersonDao2(getContext());
ContentValues values=new ContentValues();//类似于map
values.put("name", "zhh");
values.put("address", "jiaozuo");
boolean flag=service2.mod(values, "id=?", new String[]{""});
}
public void find(){
PersonService2 service2=new PersonDao2(getContext());
Map<String,String> map=service2.find("id=?", new String[]{""});
System.out.println("--->>"+map.toString()); }
public void findMore(){
PersonService2 service2=new PersonDao2(getContext());
//select * from person
List<Map<String,String>> list=service2.findMore(null, null);
System.out.println("--->>"+list.toString());
}
}