Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

时间:2024-01-11 20:29:32

sdCard:默认路径在 /storage/sdcard/...

Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件。
Context提供了如下两个方法来打开应用程序的数据文件夹里的文件IO流:
FileInputStream openFileInput(String name):打开应用程序的数据文件夹下的name文件对应的输入流
FileOutStream openFileOutput(String name,int mode):打开应用程序的数据的文件夹下的name文件对应输出流,其中第二个方法的第二个参数是指定打开文件的模式,该模式支持如下值:
Context.MODE_PRIVATE    =  0
Context.MODE_APPEND    =  32768 \\追加
Context.MODE_WORLD_READABLE =  1 \\可读
Context.MODE_WORLD_WRITEABLE =  2 \\可写
除此之外,Context还提供了如下几个方法来访问应用程序的数据文件夹:
getDir(String name,int mode) 在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir() 获取该应用程序的数据文件夹的绝对路径
String[] fileList() 返回该应用程序的数据文件夹下的指定文件
读写SD卡上的文件的步骤如下:
1、 Environment的getExternalStorageDirectory方法来判断手机上是否插了SD卡,并且应用程序具有读写SD卡的权限。Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、调用Environment的getExternalStorageDirectory方法来获得外部存储卡,也就是SD卡的路径
3、使用FileInputStream、FileOutputStream、FileReader和FileWriter读写SD卡的内容
为了能读写SD卡上的数据,必须在应用程序的清单文件中添加读写SD卡的权限

<!-- 允许用户创建和删除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并在清单文件应用标签中注册单元测试库(图形化界面添加方便)

<!-- 允许用户单元测试 -->
<instrumentation android:targetPackage="com.example.android_06storage" android:name="android.test.InstrumentationTestRunner"></instrumentation>
<!-- 添加在应用标签中 -->
<uses-library android:name="android.test.runner"/>
 <?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文件夹中获取文件:

InputStream in = getResources().getAssets().open(fileName);
EncodingUtils.getString(buffer, “UTF-8”);//解决中文乱码的问题
ØAndroid 获取assets的绝对路径 第一种方法:String path = "file:///android_asset/文件名";
                                            第二种方法:InputStream abpath = getClass().getResourceAsStream("/assets/文件名");
注意:资源文件只能读不能写
sharedPreference:读写key-value对的SharedPreferences参数共享的文件存放方式。默认路径在 /data/data/...
在实际的软件界面设计中,我们需要保存一些系统的参数,例如屏幕大小和亮度、高度等。在没有数据的情况下我们把这些参数设置到参数共享的文件中以便下次访问
SharedPreferences用法的基本步骤:
step1、SharedPreferences preferences =context.getSharedPreferences("login",Context.MODE_PRIVATE);
step2、通过SharedPreferences .edit方法获得一个Editor对象。
step3、通过SharedPreferences 的Editor.putXXX方法放置键值对保存到文件中。
step4、最后调用commit方法保存文件。
注意:只有事务结束之后才能提交。
存取共享文件中的内容代码:
 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

项目目录如下:

Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

方法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());
}
}