Android三种存储数据技术

第一种: 使用SharedPreferences存储数据

 

适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等

核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。

SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下:

 

Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。

Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。

Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写

Editor有如下主要重要方法:

 

SharedPreferences.Editor clear():清空SharedPreferences里所有数据

SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据

SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项

boolean commit(): 当Editor编辑完成后,使用该方法提交修改

应用:

(存储)

SharedPreferences.Editor editor = getSharedPreferences("data",

MODE_PRIVATE).edit();

editor.putString("name", "Tom");

editor.putInt("age", 28);

editor.putBoolean("married", false);

editor.apply();

(读取)

SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);

String name = sp.getString("name", "");

int age = sp.getInt("age", 0);

boolean married = sp.getBoolean("married", false);

Toast.makeText(MainActivity.this,

"name:" + name + "--->age:" + age + "--->married:" + married, Toast.LENGTH_LONG).show();

第二种: 文件存储数据

核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream

openFileInput(String name);

FileOutputStream(String name , int mode),

这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选:

MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND

MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

除此之外,Context还提供了如下几个重要的方法:

 

getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录

File getFilesDir():获取该应用程序的数据文件夹得绝对路径

String[] fileList():返回该应用数据文件夹的全部文件

应用:

(存储)

public void save(String inputText) {

FileOutputStream out = null;

BufferedWriter writer = null;

try {

        out = openFileOutput("data", Context.MODE_PRIVATE);

        writer = new BufferedWriter(new OutputStreamWriter(out));

        writer.write(inputText);

        Log.d(TAG, "save: " + inputText);

        }  catch (IOException e) {

          e.printStackTrace();

           }   finally {

        try {

        if (writer != null) {

        writer.close();

        }

                } catch (IOException e) {

                e.printStackTrace();

        }

    }

}

(读取)

public String load() {

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 {

                        try {

                                if (reader != null) {

                                reader.close();

                                }

                } catch (IOException e) {

                e.printStackTrace();

               }

        }

        return content.toString();

}

 

第三种:SQLite存储数据

SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用

 

1 db.executeSQL(String sql);

2 db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集

除了统一的形式之外,他们还有各自的操作方法:

 

1 db.insert(String table, String nullColumnHack, ContentValues values);

2 db.update(String table, Contentvalues values, String whereClause, String whereArgs);

3 db.delete(String table, String whereClause, String whereArgs);

以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样

参数说明:

table:表名称

colums:表示要查询的列所有名称集

selection:表示WHERE之后的条件语句,可以使用占位符

selectionArgs:条件语句的参数数组

groupBy:指定分组的列名

having:指定分组条件,配合groupBy使用

orderBy:y指定排序的列名

limit:指定分页参数

distinct:指定“true”或“false”表示要不要过滤重复值

Cursor:返回值,相当于结果集ResultSet

SQLiteOpenHelper 该类是SQLiteDatabase一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。

SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数: 1.onCreate(SQLiteDatabase) 在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

2.onUpgrade(SQLiteDatabase,int,int) 当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

3.onOpen(SQLiteDatabase): 这是当打开数据库时的回调函数,一般在程序中不是很常使用。

应用:

1.建立数据库帮助类

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, SQLiteDatabase.CursorFactory factory, int version) {

        super(context, name, factory, version);

        mContext = context;

}

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(CREATE_BOOK);

}

@Override

public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        sqLiteDatabase.execSQL("drop table if exists Book");

        sqLiteDatabase.execSQL("drop table if exists Category");

        onCreate(sqLiteDatabase);

  }

}

2.利用帮助类获取可读写的数据库 利用ContentValues 向数据库中写入数据

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

//组装一条数据

values.put("name","The Da Vinci Code");

values.put("author","Dan Brown");

values.put("pages","454");

values.put("price","16.96");

//插入第一条数据

db.insert("Book",null,values);

3.查询数据库中数据

SQLiteDatabase db = dbHelper.getReadableDatabase();

//查询Book表中所有数据

Cursor cursor = db.query("Book",null,null,null,null,null,null);

  if(cursor.moveToFirst()){

    //遍历cursor

   do{

        String name = cursor.getString(cursor.getColumnIndex("name"));

        String author = cursor.getString(cursor.getColumnIndex("author"));

        int pages = cursor.getInt(cursor.getColumnIndex("pages"));

        double price = cursor.getDouble(cursor.getColumnIndex("price"));

        } while(cursor.moveToNext());

   }

  cursor.close();

Android sqlite3数据库管理工具

Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。

程序运行生成的*.db文件一般位于"/data/data/项目名(包括所处包名)/databases/*.db",因此要对数据库文件进行操作需要先找到数据库文件:

1、进入shell 命令

adb shell

2、找到数据库文件

#cd data/data

#ls --列出所有项目

#cd project_name --进入所需项目名

#cd databases

#ls --列出现寸的数据库文件

3、进入数据库

#sqlite3 test_db --进入所需数据库

会出现类似如下字样:

SQLite version 3.6.22

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

至此,可对数据库进行sql操作。

4、sqlite常用命令

>.databases --产看当前数据库

>.tables --查看当前数据库中的表

>.help --sqlite3帮助

>.schema --各个表的生成语句

你可能感兴趣的:(Android基础)