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


    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"/>
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.android_06storage"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="16"
     9         android:targetSdkVersion="21" />
    10     <!-- 添加读写授权 -->
    11     
    12     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    13     <instrumentation android:targetPackage="com.example.android_06storage" android:name="android.test.InstrumentationTestRunner"></instrumentation>
    14 
    15     <application
    16         android:allowBackup="true"
    17         android:icon="@drawable/ic_launcher"
    18         android:label="@string/app_name"
    19         android:theme="@style/AppTheme" >
    20         <!-- 添加 -->
    21         <uses-library android:name="android.test.runner"/>
    22         <activity
    23             android:name=".MainActivity"
    24             android:label="@string/app_name" >
    25             <intent-filter>
    26                 <action android:name="android.intent.action.MAIN" />
    27 
    28                 <category android:name="android.intent.category.LAUNCHER" />
    29             </intent-filter>
    30         </activity>
    31     </application>
    32 
    33 </manifest>
    View Code

    读取sdCard代码:

     1 package com.example.android_06storage;
     2 
     3 import java.io.ByteArrayOutputStream;
     4 import java.io.File;
     5 import java.io.FileInputStream;
     6 import java.io.FileNotFoundException;
     7 import java.io.FileOutputStream;
     8 import java.io.IOException;
     9 
    10 import android.content.Context;
    11 import android.os.Environment;
    12 
    13 public class FileService {
    14 
    15     private Context context;
    16     public FileService() {
    17         // TODO Auto-generated constructor stub
    18     }
    19     public FileService(Context context) {
    20         // TODO Auto-generated constructor stub
    21         this.context=context;
    22     }
    23 
    24     /**
    25      * 
    26      * @param fileName文件名
    27      * @param Content文件内容
    28      * @return
    29      * @throws Exception 
    30      */
    31     public  boolean saveContentToSdcard(String fileName,String Content) throws Exception{
    32         boolean flag=false;
    33         FileOutputStream fileOutputStream=null;
    34         File file=new File(Environment.getExternalStorageDirectory(),fileName);
    35         if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    36             try {
    37                 fileOutputStream=new FileOutputStream(file);
    38                 fileOutputStream.write(Content.getBytes());
    39                 flag=true;
    40             } catch (FileNotFoundException e) {
    41                 // TODO Auto-generated catch block
    42                 e.printStackTrace();
    43             }
    44             finally{
    45                 if(fileOutputStream!=null)
    46                     fileOutputStream.close();
    47             }
    48             
    49         }
    50         return flag;
    51     }
    52     public String getDataFromSdcard(String fileName){
    53         FileInputStream fileInputStream=null;
    54         ByteArrayOutputStream out=new ByteArrayOutputStream();
    55         File file=new File(Environment.getExternalStorageDirectory(),fileName);
    56         if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    57             try {
    58                 fileInputStream=new FileInputStream(file);
    59                 int len=0;
    60                 byte[] data=new byte[1024];
    61                 while((len=fileInputStream.read(data))!=-1){
    62                     out.write(data, 0, len);
    63                 }
    64             } catch (FileNotFoundException e) {
    65                 // TODO Auto-generated catch block
    66                 e.printStackTrace();
    67             } catch (IOException e) {
    68                 // TODO Auto-generated catch block
    69                 e.printStackTrace();
    70             }finally{
    71                 if(fileInputStream!=null)
    72                     try {
    73                         fileInputStream.close();
    74                     } catch (IOException e) {
    75                         // TODO Auto-generated catch block
    76                         e.printStackTrace();
    77                     }
    78             }
    79         }
    80         return new String (out.toByteArray());
    81         
    82     }
    83 }
    View Code

    测试类:

     1 package com.example.android_06storage;
     2 
     3 import android.content.Context;
     4 import android.test.AndroidTestCase;
     5 import android.util.Log;
     6 
     7 public class myTest extends AndroidTestCase {
     8 
     9     private static final String TAG="myTest";
    10     public myTest() {
    11         // TODO Auto-generated constructor stub
    12     }
    13 
    14     public void saveFile() throws Exception{
    15         Context context=getContext();
    16         FileService fileService=new FileService(context);
    17         boolean flag=fileService.saveContentToSdcard("hello.txt", "你好 阳光");
    18         System.out.println(flag);
    19         Log.i(TAG, "---->>"+flag);
    20         
    21     }
    22     public void readFile() throws Exception{
    23         Context context=getContext();
    24         FileService fileService=new FileService(context);
    25         String msg=fileService.getDataFromSdcard("hello.txt");
    26         System.out.println(msg);
    27         Log.i(TAG, "---->>"+msg);
    28         
    29     }
    30 }
    View Code

    读取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方法保存文件。
    注意:只有事务结束之后才能提交。
    存取共享文件中的内容代码:
     1 package com.example.android_06storage_sharedpreference;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 import android.content.Context;
     7 import android.content.SharedPreferences;
     8 
     9 public class SharedPreference {
    10 
    11     private Context context;
    12     
    13     public SharedPreference() {
    14         // TODO Auto-generated constructor stub
    15     }
    16 
    17     public SharedPreference(Context context) {
    18         // TODO Auto-generated constructor stub
    19         this.context=context;
    20     }
    21     public boolean SaveKVmessage(String name,String pwd){
    22         boolean flag=false;
    23         SharedPreferences share=context.getSharedPreferences("userinfo", context.MODE_PRIVATE);
    24         //对数据进行编辑
    25         SharedPreferences.Editor editor=share.edit();
    26         editor.putString("name", name);
    27         editor.putString("password", pwd);
    28         //完成编辑将数据持久化存储到存储介质中
    29         flag=editor.commit();
    30         return flag;
    31     }
    32     public Map<String,Object> ReadKVmessage(){
    33         Map<String,Object> map=new HashMap<String, Object>();
    34         
    35         SharedPreferences share=context.getSharedPreferences("userinfo", context.MODE_PRIVATE);
    36         
    37         String name=share.getString("name", "");
    38         String password=share.getString("password", "");
    39         
    40         map.put("name", name);
    41         map.put("password", password);
    42          
    43         return map;
    44     }
    45 }
    View Code

    测试类:

     1 package com.example.android_06storage_sharedpreference;
     2 
     3 import java.util.Map;
     4 
     5 import android.content.Context;
     6 import android.test.AndroidTestCase;
     7 import android.util.Log;
     8 
     9 public class MyTest extends AndroidTestCase {
    10     
    11     private static final String TAG="MyTest";
    12     public  MyTest(){
    13         
    14     }
    15     public void save(){
    16         Context context=getContext();
    17         SharedPreference sharedPreference=new SharedPreference(context);
    18         boolean flag=sharedPreference.SaveKVmessage("admin", "123");
    19         Log.i(TAG, "--->>"+flag);
    20     }
    21     public void Read(){
    22         Context context=getContext();
    23         SharedPreference sharedPreference=new SharedPreference(context);
    24         Map<String,Object> map=sharedPreference.ReadKVmessage();
    25         Log.i(TAG, "--->>"+map.toString());
    26     }
    27 }
    View Code

    SQLite数据库的存储:默认路径在 /data/data/...

    SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:

    1、轻量级:SQLite和CS模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也很小。

    2、独立性:SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

    3、隔离性:SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

    4、跨平台:SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。

    5、多语言接口:SQLite数据库支持很多语言编程接口,比如CC++、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

     1 package com.example.android_06sotrage_sqlite.db;
     2 
     3 import android.content.Context;
     4 import android.database.DatabaseErrorHandler;
     5 import android.database.sqlite.SQLiteDatabase;
     6 import android.database.sqlite.SQLiteDatabase.CursorFactory;
     7 import android.database.sqlite.SQLiteOpenHelper;
     8 
     9 public class DBOpenHelper extends SQLiteOpenHelper {
    10 
    11 
    12     private static String name="mydb.db";//数据库名称
    13     private static  int version=1;//数据库版本号
    14     
    15     public DBOpenHelper(Context context) {
    16         super(context, name, null, version);
    17         // TODO Auto-generated constructor stub
    18         //虽然定义了数据库的名称和版本号,
    19         //但直到调用getReadableDatabase或getWritableDatabase的时候才最终生成数据库
    20         
    21         
    22     }
    23     
    24 /**
    25  * 当数据库创建的时候 是第一次被执行
    26  * 通常用来完成对数据库表的创建
    27  */
    28     @Override
    29     public void onCreate(SQLiteDatabase db) {
    30         // TODO Auto-generated method stub
    31         //支持的数据类型:整型数据 字符串 日期类型 二进制数据类型
    32         String sql="create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
    33         db.execSQL(sql);
    34     }
    35 
    36     @Override
    37     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    38         // TODO Auto-generated method stub
    39         //原来版本创建时 是1  如果设置成>1的数字,则会更新数据库版本,这里只需要执行alter语句就行
    40         String sql="alter table person add sex varchar(8)";
    41         db.execSQL(sql);
    42     }
    43 
    44 }
    View Code

    然后在service包下建接口类

     1 package com.example.android_06sotrage_sqlite.service;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 
     6 public interface PersonService {
     7 
     8     public boolean add(Object[] params);
     9     public boolean del(Object[] params);
    10     public boolean mod(Object[] params);
    11     public Map<String,String> find(String[] params);
    12     public List<Map<String,String>> findMore(String[] params);
    13 }
    View Code

    第三在dao包下建实现类

      1 package com.example.android_06sotrage_sqlite.dao;
      2 
      3 import java.util.ArrayList;
      4 import java.util.HashMap;
      5 import java.util.List;
      6 import java.util.Map;
      7 
      8 import android.content.Context;
      9 import android.database.Cursor;
     10 import android.database.sqlite.SQLiteDatabase;
     11 
     12 import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
     13 import com.example.android_06sotrage_sqlite.service.PersonService;
     14 
     15 public class PersonDao implements PersonService {
     16 
     17     private DBOpenHelper helper=null;
     18     public PersonDao(Context context) {
     19         // TODO Auto-generated constructor stub
     20         helper=new DBOpenHelper(context);
     21     }
     22 
     23     @Override
     24     public boolean add(Object[] params) {
     25         // TODO Auto-generated method stub
     26         boolean flag=false;
     27         //SQLiteDatabase实现数据库的增删改
     28                 SQLiteDatabase database=null;
     29                 try {
     30                     String sql="insert into person(name,address) values(?,?)";
     31                     database=helper.getWritableDatabase();
     32                     database.execSQL(sql,params);
     33                     flag=true;
     34                 } catch (Exception e) {
     35                     // TODO: handle exception
     36                     e.printStackTrace();
     37                 }
     38                 finally{
     39                     if(database!=null)
     40                         database.close();
     41                 }
     42         return flag;
     43     }
     44 
     45     @Override
     46     public boolean del(Object[] params) {
     47         // TODO Auto-generated method stub
     48         boolean flag=false;
     49         SQLiteDatabase database=null;
     50         try {
     51             String sql="delete from person where id=?";
     52             database=helper.getWritableDatabase();
     53             database.execSQL(sql,params);
     54             flag=true;
     55         } catch (Exception e) {
     56             // TODO: handle exception
     57             e.printStackTrace();
     58         }
     59         finally{
     60             if(database!=null)
     61                 database.close();
     62         }
     63         return flag;
     64     }
     65 
     66     @Override
     67     public boolean mod(Object[] params) {
     68         // TODO Auto-generated method stub
     69         boolean flag=false;
     70         SQLiteDatabase database=null;
     71         try {
     72             String sql="update person set name=?,address=? where id=?";
     73             database=helper.getWritableDatabase();
     74             database.execSQL(sql,params);
     75             flag=true;
     76         } catch (Exception e) {
     77             // TODO: handle exception
     78             e.printStackTrace();
     79         }
     80         finally{
     81             if(database!=null)
     82                 database.close();
     83         }
     84         return flag;
     85     }
     86 
     87     @Override
     88     public Map<String, String> find(String[] params) {
     89         // TODO Auto-generated method stub
     90         Map<String, String> map=new HashMap<String, String>();
     91         SQLiteDatabase database=null;
     92         try {
     93             String sql="select * from person where id=?";
     94             database=helper.getReadableDatabase();
     95             Cursor cursor=database.rawQuery(sql, params);
     96             //数据库列的个数
     97             int col=cursor.getColumnCount();
     98              while(cursor.moveToNext()){
     99                  for (int i = 0; i < col; i++) {
    100                     String col_name=cursor.getColumnName(i);
    101                     String col_val=cursor.getString(cursor.getColumnIndex(col_name));
    102                     if(col_val==null)
    103                         col_val="";
    104                     map.put(col_name, col_val);
    105                 }
    106                  
    107              }
    108         } catch (Exception e) {
    109             // TODO: handle exception
    110             e.printStackTrace();
    111         }
    112         finally{
    113             if(database!=null)
    114                 database.close();
    115         }
    116         return map;
    117     }
    118 
    119     @Override
    120     public List<Map<String, String>> findMore(String[] params) {
    121         // TODO Auto-generated method stub
    122         List<Map<String, String>>  list=new ArrayList<Map<String,String>>();
    123         SQLiteDatabase database=null;
    124         try {
    125             String sql="select * from person";
    126             database=helper.getReadableDatabase();
    127             Cursor cursor=database.rawQuery(sql, params);
    128             //数据库列的个数
    129             int col=cursor.getColumnCount();
    130              while(cursor.moveToNext()){
    131                  Map<String, String> map=new HashMap<String, String>();
    132                  for (int i = 0; i < col; i++) {
    133                     String col_name=cursor.getColumnName(i);
    134                     String col_val=cursor.getString(cursor.getColumnIndex(col_name));
    135                     if(col_val==null)
    136                         col_val="";
    137                     map.put(col_name, col_val);
    138                 }
    139                 list.add(map); 
    140              }
    141         } catch (Exception e) {
    142             // TODO: handle exception
    143             e.printStackTrace();
    144         }
    145         finally{
    146             if(database!=null)
    147                 database.close();
    148         }
    149         return list;
    150     }
    151 
    152 }
    View Code

    最后创建测试类:

     1 package com.example.android_06sotrage_sqlite.test;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 
     6 import com.example.android_06sotrage_sqlite.dao.PersonDao;
     7 import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
     8 import com.example.android_06sotrage_sqlite.service.PersonService;
     9 
    10 public class MyTest extends android.test.AndroidTestCase{
    11 
    12     public MyTest() {
    13         // TODO Auto-generated constructor stub
    14     }
    15 
    16     public void createDB(){
    17         DBOpenHelper helper=new DBOpenHelper(getContext());
    18         helper.getWritableDatabase();//此时才真正创建了数据库
    19     }
    20     public void add(){
    21         PersonService service=new PersonDao(getContext());
    22         Object[] params={"mlj","xinxiang"};
    23         boolean flag=service.add(params);
    24         System.out.println("--->>"+flag);
    25     }
    26     public void del(){
    27         PersonService service=new PersonDao(getContext());
    28         Object[] params={1};
    29         boolean flag=service.del(params);
    30         System.out.println("--->>"+flag);
    31     }
    32     public void mod(){
    33         PersonService service=new PersonDao(getContext());
    34         Object[] params={"mlj","huojia","1"};
    35         boolean flag=service.mod(params);
    36         System.out.println("--->>"+flag);
    37     }
    38     public void find(){
    39         PersonService service=new PersonDao(getContext());
    40         String[] params={"1"};
    41         Map<String,String> map=service.find(params);
    42         System.out.println("--->>"+map.toString());
    43     }
    44     public void findMore(){
    45         PersonService service=new PersonDao(getContext());
    46         List<Map<String,String>> list=service.findMore(null);
    47         System.out.println("--->>"+list.toString());
    48     }
    49 }
    View Code

    方法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类同上

    新建接口类:

     1 package com.example.android_06sotrage_sqlite.service;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 
     6 import android.content.ContentValues;
     7 
     8 public interface PersonService2 {
     9 
    10     public boolean add(ContentValues values);
    11     public boolean del(String whereClause,String[] whereArgs);
    12     public boolean mod(ContentValues values, String whereClause, String[] whereArgs);
    13     public Map<String,String> find(String selection,String[] selectionArgs);
    14     public List<Map<String,String>> findMore(String selection,String[] selectionArgs);
    15 }
    View Code

    第三在dao包下建实现类:

      1 package com.example.android_06sotrage_sqlite.dao;
      2 
      3 import java.util.ArrayList;
      4 import java.util.HashMap;
      5 import java.util.List;
      6 import java.util.Map;
      7 
      8 import android.content.ContentValues;
      9 import android.content.Context;
     10 import android.database.Cursor;
     11 import android.database.sqlite.SQLiteDatabase;
     12 
     13 import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
     14 import com.example.android_06sotrage_sqlite.service.PersonService2;
     15 
     16 public class PersonDao2 implements PersonService2 {
     17 
     18     private DBOpenHelper helper=null;
     19     public PersonDao2(Context context) {
     20         // TODO Auto-generated constructor stub
     21         helper=new DBOpenHelper(context);
     22     }
     23 
     24     @Override
     25     public boolean add(ContentValues values) {
     26         // TODO Auto-generated method stub
     27         boolean flag=false;
     28         long id=-1;//返回最终结果值 如果不等于-1,即表示成功插入
     29         //SQLiteDatabase实现数据库的增删改
     30                 SQLiteDatabase database=null;
     31                 try {
     32                     database=helper.getWritableDatabase();
     33                     id=database.insert("person", null, values);
     34                     flag=(id!=-1?true:false);
     35                 } catch (Exception e) {
     36                     // TODO: handle exception
     37                     e.printStackTrace();
     38                 }
     39                 finally{
     40                     if(database!=null)
     41                         database.close();
     42                 }
     43         return flag;
     44     }
     45 
     46     @Override
     47     public boolean del(String whereClause,String[] whereArgs) {
     48         // TODO Auto-generated method stub
     49         boolean flag=false;
     50         int count=0;//最终影响的行数
     51         SQLiteDatabase database=null;
     52         try {
     53             database=helper.getWritableDatabase();
     54             count=database.delete("person", whereClause, whereArgs);
     55             flag=(count>0?true:false);
     56         } catch (Exception e) {
     57             // TODO: handle exception
     58             e.printStackTrace();
     59         }
     60         finally{
     61             if(database!=null)
     62                 database.close();
     63         }
     64         return flag;
     65     }
     66 
     67     @Override
     68     public boolean mod(ContentValues values, String whereClause, String[] whereArgs) {
     69         boolean flag=false;
     70         int count=0;//最终影响的行数
     71         SQLiteDatabase database=null;
     72         try {
     73             database=helper.getWritableDatabase();
     74             count=database.update("person", values, whereClause, whereArgs);
     75             flag=(count>0?true:false);
     76         } catch (Exception e) {
     77             // TODO: handle exception
     78             e.printStackTrace();
     79         }
     80         finally{
     81             if(database!=null)
     82                 database.close();
     83         }
     84         return flag;
     85     }
     86 
     87     @Override
     88     public Map<String, String> find(String selection,String[] selectionArgs) {
     89         // TODO Auto-generated method stub
     90         Map<String, String> map=new HashMap<String, String>();
     91         SQLiteDatabase database=null;
     92         try {
     93             database=helper.getReadableDatabase();
     94             /**
     95              * distinct 是否返回唯一值
     96              * table name表名
     97              * column name 设置为空   表明所有列
     98              * selection
     99              * selectionArgs
    100              * groupBy null
    101              * having null
    102              * orderBy null
    103              * limit null
    104              */
    105             Cursor cursor=database.query(true, "person", null, selection, selectionArgs, null, null, null, null);
    106             //数据库列的个数
    107             int col=cursor.getColumnCount();
    108              while(cursor.moveToNext()){
    109                  for (int i = 0; i < col; i++) {
    110                      String col_name=cursor.getColumnName(i);
    111                      String col_val=cursor.getString(cursor.getColumnIndex(col_name));
    112                       if(col_val==null)
    113                             col_val="";
    114                       map.put(col_name, col_val);
    115                  }
    116              }
    117          
    118         } catch (Exception e) {
    119             // TODO: handle exception
    120             e.printStackTrace();
    121         }
    122         finally{
    123             if(database!=null)
    124                 database.close();
    125         }
    126         return map;
    127     }
    128 
    129     @Override
    130     public List<Map<String, String>> findMore(String selection,String[] selectionArgs) {
    131         // TODO Auto-generated method stub
    132         List<Map<String, String>>  list=new ArrayList<Map<String,String>>();
    133         SQLiteDatabase database=null;
    134         try {
    135             database=helper.getReadableDatabase();
    136             Cursor cursor=database.query(false, "person", null, selection, selectionArgs, null, null, null, null);
    137             //数据库列的个数
    138             int col=cursor.getColumnCount();
    139              while(cursor.moveToNext()){
    140                  Map<String, String> map=new HashMap<String, String>();
    141                  for (int i = 0; i < col; i++) {
    142                     String col_name=cursor.getColumnName(i);
    143                     String col_val=cursor.getString(cursor.getColumnIndex(col_name));
    144                     if(col_val==null)
    145                         col_val="";
    146                     map.put(col_name, col_val);
    147                 }
    148                 list.add(map); 
    149              }
    150         } catch (Exception e) {
    151             // TODO: handle exception
    152             e.printStackTrace();
    153         }
    154         finally{
    155             if(database!=null)
    156                 database.close();
    157         }
    158         return list;
    159     }
    160 
    161 }
    View Code

    最后创建测试类:

     1 package com.example.android_06sotrage_sqlite.test;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 
     6 import android.content.ContentValues;
     7 
     8 import com.example.android_06sotrage_sqlite.dao.PersonDao2;
     9 import com.example.android_06sotrage_sqlite.db.DBOpenHelper;
    10 import com.example.android_06sotrage_sqlite.service.PersonService2;
    11 
    12 public class MyTest2 extends android.test.AndroidTestCase{
    13 
    14     public MyTest2() {
    15         // TODO Auto-generated constructor stub
    16     }
    17 
    18     public void createDB(){
    19         DBOpenHelper helper=new DBOpenHelper(getContext());
    20         helper.getWritableDatabase();//此时才真正创建了数据库
    21     }
    22     public void add(){
    23         PersonService2 service=new PersonDao2(getContext());
    24         ContentValues values=new ContentValues();//类似于map
    25         values.put("name", "zhh");
    26         values.put("address", "henan");
    27         service.add(values);
    28         boolean flag=service.add(values);
    29         System.out.println("--->>"+flag);
    30     }
    31     public void del(){
    32         PersonService2 service2=new PersonDao2(getContext());
    33          /**
    34           * whereClause 条件字句 
    35           * 原来sql语句是"delete from person where id=? "
    36           * 现在的字句不包含where关键字
    37           * whereArgs 字句中的参数列表
    38           */
    39         boolean flag=service2.del("id=?", new String[]{"1"});
    40         System.out.println("--->>"+flag);
    41     }
    42     public void mod(){
    43         PersonService2 service2=new PersonDao2(getContext());
    44         ContentValues values=new ContentValues();//类似于map
    45         values.put("name", "zhh");
    46         values.put("address", "jiaozuo");
    47         boolean flag=service2.mod(values, "id=?", new String[]{"2"});
    48     }
    49     public void find(){
    50         PersonService2 service2=new PersonDao2(getContext());
    51         Map<String,String> map=service2.find("id=?", new String[]{"1"});
    52         System.out.println("--->>"+map.toString());
    53         
    54     }
    55     public void findMore(){
    56         PersonService2 service2=new PersonDao2(getContext());
    57         //select * from person
    58         List<Map<String,String>> list=service2.findMore(null, null);
    59         System.out.println("--->>"+list.toString());
    60     }
    61 }
    View Code
  • 相关阅读:
    Vue.Draggable/SortableJS 的排序功能,在VUE中的使用
    vue项目中安装使用echarts
    CSS3美化有序列表
    Git 设置
    javascript 使用btoa和atob来进行Base64转码和解码
    vue 裁剪图片,插件Cropper的使用
    PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作
    HTML5的 input:file上传 以及 类型控制
    phpexcel 导出到xls文件的时候出现乱码解决
    Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
  • 原文地址:https://www.cnblogs.com/mlj5288/p/4963143.html
Copyright © 2020-2023  润新知