Android 数据存储

Android 数据存储

1. SharedPreferences 存储

Android提供的用来以最简单的方式对数据进行永久保存的方法,以XML文件形式,保存在手机中的data/data/com.xxx.xxx/目录中。

存储数据基本步骤:

  1. 获取SharedPreferences对象

    getSharedPreferences(String name, int mode)
    

    其中,name指文件名;mode指访问权限,常用MODE_PRIVATE(被本应用读写), MODE_MULTI_PROCESS(跨引用读写)

    当然也可以直接用getPreferences(int mode)来仅指定权限

  2. 获取SharedPreferences.Editor对象

    <SharedPreferences>.eidt()

  3. SharedPreferences.Editor对象添加数据

    <SharedPreferences.Editor>.put<数据类型>(),如putBoolean()

  4. 提交数据

    <SharedPreferences.Editor>.commit()

读取数据基本步骤:

  1. 获取SharedPreferences对象

  2. 获取数据

    <SharedPreferences>.get<数据类型>(),如getBoolean()

2. 文件存储

将文件存储到本地磁盘,分为内部存储和外部存储。

2.1 内部存储

内部存储:将文件存储在系统的data/data/<包名>/files/目录下,这些文件只能被本应用访问,卸载后会被删除。

保存举例:

FileOutputStream fos = null;
try{
	fos = openFileOutput("文件名", <访问权限 int mode>);
    fos.write(Byte[] data);//写数据到输出流
    fos.flush();// 清缓存
} catch (Exception e) {
    
} finally {
    if (fos != null) {
        fos.close();
    }
}

读取举例:

FileInputStream fis = null;
byte[] buffer = null;// 缓冲数据
String data = null;// 字符串类型数据
try {
	fis = openFileInput("文件名");
	buffer = new byte[fis.available()];// 实例化字节数组
	fis.read(buffer);
} catch (Exception e) {

} finally {
	if (fis != null) {
		fis.close();
		data = new String(buffer);
	}
}

2.2 外部存储

在这里插入图片描述

使用举例:

package com.mingrisoft;

import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends Activity {
    byte[] buffer = null;   //定义保存数据的数组
    private File file;      //定义存储路径

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText etext = (EditText) findViewById(R.id.editText);      //获取用于填写记事本信息的编辑框组件
        ImageButton btn_save = (ImageButton) findViewById(R.id.save);        //获取保存按钮
        ImageButton btn_abolish = (ImageButton) findViewById(R.id.abolish);  //获取取消按钮
        file = new File(Environment.getExternalStorageDirectory(), "Text.text");  //设置存储sd卡根目录

        btn_save.setOnClickListener(new View.OnClickListener() {  //实现外部存储填写的文本信息
            @Override
            public void onClick(View v) {
                FileOutputStream fos = null;              //定义文件输出流
                String text = etext.getText().toString();        //获取文本信息
                try {
                    fos = new FileOutputStream(file);     //获得文件输出流,并指定文件保存的位置
                    fos.write(text.getBytes());           //保存文本信息
                    fos.flush();                           //清除缓存
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        try {
                            fos.close();                    //关闭文件输出流
                            Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        //实现第二次打开应用时显示上一次所保存的文本信息
        FileInputStream fis = null;                         //定义文件输入流
        try {
            fis = new FileInputStream(file);                 //获得文件输入流
            buffer = new byte[fis.available()];            //保存数据的数组
            fis.read(buffer);                               //从输入流中读取数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();                                      //关闭输入流
                    String data = new String(buffer);                // 获得数组中保存的数据
                    etext.setText(data);                              //保存到编辑框中
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        btn_abolish.setOnClickListener(new View.OnClickListener() {  //实现单击取消按钮,退出应用
            @Override
            public void onClick(View v) {
                finish();                                      //退出应用
            }
        });


    }
}

3. 数据库存储

操作安卓内部存储中的SQlite3数据库

在这里插入图片描述

基本步骤:

  • 创建自定义数据库操作类,继承自SQLiteOpenHelper,重写构造函数,实现抽象方法。

    • Oncreate():连接数据库后,可以用db.execSQL(<string sql>)执行SQL语句
    • onUpgrade():数据库版本更新

    举例:

    package com.mingrisoft;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    /**
     * Created by Administrator.
     */
    public class DBOpenHelper extends SQLiteOpenHelper {
        //定义创建数据表dict的SQL语句
        final String CREATE_TABLE_SQL =
                "create table dict(_id integer primary " +
                        "key autoincrement , word , detail)";
    
        public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, null, version); //重写构造方法并设置工厂为null
        }
    
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_SQL); //创建单词信息表
        }
        @Override
        // 重写基类的onUpgrade()方法,以便数据库版本更新
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            //提示版本更新并输出旧版本信息与新版本信息
            System.out.println("---版本更新-----" + oldVersion + "--->" + newVersion);
        }
    }
    
    
    

使用:

  • 获取数据库对象{操作基础):<SQLiteOpenHelper>.getReadableDatabase()

  • 增:

    <SQLiteDatabase>.insert (String table, String nullColumnHack, ContentValues values)

    使用举例:

     ContentValues values=new ContentValues();
     values.put("key", value);       //保存数据
     readableDatabase.insert("数据库名",null , values);//执行插入操作
    
  • 删:<SQLiteDatabase>.delete (String table, String whereClause, String[] whereArgs)

    • table:数据库表
    • whereClause:对应SQL中的where语句部分
    • whereArgs:若whereClause中含有?,则将被whereArgs中的数据替换。
  • 改:

    public int update (String table, 
                    ContentValues values, 
                    String whereClause, 
                    String[] whereArgs)
    
  • 查:

    public Cursor query (boolean distinct, 
                    String table, 
                    String[] columns, 
                    String selection, 
                    String[] selectionArgs, 
                    String groupBy, 
                    String having, 
                    String orderBy, 
                    String limit)
    
    • selection等于whereClause
    • distinct:是否严格限制,是则每行唯一。
  • Cursor:数据库结果集

    使用举例:

    Cursor cursor=dbOpenHelper.getReadableDatabase().query("dict",null
                            ,"word = ?",new String[]{key},null,null,null);
    ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();   //创建ArrayList对象,用于保存查询出的结果
    while (cursor.moveToNext()) {  // 遍历Cursor结果集
        Map<String, String> map = new HashMap<>();  // 将结果集中的数据存入HashMap中
        // 取出查询记录中第2列、第3列的值
        map.put("word", cursor.getString(1));
        map.put("interpret", cursor.getString(2));
        resultList.add(map);                        //将查询出的数据存入ArrayList中
    }
    
  • 其他类型的SQL语句(非select, update, delete, insert):

    public void execSQL (String sql, 
                    Object[] bindArgs)
    
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值