Android第六讲——数据存储(五种)SharedPreferences、内部存储(缓存cache)、外部存储(Sdcrad)、SQLite数据库、网络存储

目录

SharedPreferences
内部存储
外部存储
SQLite数据库存储
网络存储

SharedPreferences

通过键值对的形式保存简单的、私有的数据

建一个SharedPreferences对象;初始化有两种方式:

  • preferences=getSharedPreferences(“preferences_test”,MODE_PRIVATE); 会在data—>data—>完整包名—>shared_prefs—>创建一个自己写的preferences_test.xml
  • preferences = getPreferences(MODE_PRIVATE); 会在data—>data—>完整包名—>shared_prefs—>自己创建一个默认的MainActivity.xml

    向xml中读写数据:
    再向xml中写入数据时,要注意preferences要调用edit()方法,并且最后写完后要记得commit,否则写入失败。
    1、向xml中写数据

    /**
     * 向xml中写数据
     */
    private void writeToPreferences() {
//        preferences = getSharedPreferences("preferences_test",MODE_PRIVATE);
        preferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();//preferences不能直接写入数据,需要.edit
        editor.putString("edittext_write", mEditTextWrite.getText().toString());
        editor.commit();//记住edit要提交
    }

2、从xml中读数据

    /**
     * 从xml中读数据
     */
    private void readFromPreferences() {
//        preferences = getSharedPreferences("preferences_test",MODE_PRIVATE);
        preferences = getPreferences(MODE_PRIVATE);
        String content = preferences.getString("edittext_write", "defualt");//第一个参数是键值key,第二个参数是如果没有该键值要返回的参数
        mTextViewRead.setText(content);
    }

查看时从data—>data—>完整包名—>shared_prefs—>preferences_test.xml(MainActivity.xml)中导出查看
这里写图片描述

内部存储

把私有的数据保存在设备的内部存储介质中
缓存:手机给每个应用分配的一部分空间,将私有数据保存在这部分空间中
缓存的存储与读取数据有两种方式:

  1. 自己创建的文件在files文件夹中。
    ①向缓存中写数据:类似与想文件中写数据,openFileOutput(“文件名”,它的权限(私有的));

     /**
     \* 向缓存中写数据(在data--->data--->包名--->files中)
     */
    private void writeToCache() {
        try {
            FileOutputStream outputStream = openFileOutput("hellocache.txt", MODE_PRIVATE);
            OutputStreamWriter writer = new OutputStreamWriter(outputStream);
            PrintWriter printWriter = new PrintWriter(writer);
            printWriter.write("你好缓存");
            printWriter.flush();
            printWriter.close();
            writer.close();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    ②从缓存中读数据:类似文件的读取,openFileInput(“文件名”)

     /**
     \* 从缓存中读数据(在data--->data--->包名--->files中)
     */
    private void readFromCatch() {
        try {
            FileInputStream inputStream = openFileInput("hellocache.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line = reader.readLine();
            while (line != null) {
                Log.d("InputStream", line);
                line = reader.readLine();
            }
            reader.close();
            inputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    这里写图片描述

  2. 自己创建的文件在cache文件夹中
    也是类似与文件的读写不过File file = new File(getCacheDir(), “helloworld”);第一个参数是cache文件夹。故会在cache文件夹下找helloword文件。(要判断文件是不是存在,不存在就创建一个)
    ①想缓存中写入数据。

    /**
     * 向cache文件夹写入缓存数据(在data--->data--->包名--->cache中)
     */
    private void writeToCacheDir() {
        File file = new File(getCacheDir(), "helloworld");
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            FileOutputStream outputStream = new FileOutputStream(file);//向创建的文件中写数据
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
            writer.write("helloworld");
            writer.flush();
            writer.close();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

②从缓存中读取数据。

     /**
     * 从cache文件夹读取缓存数据(在data--->data--->包名--->cache中)
     */
    private void readFromCacheDir() {
        File file = new File(getCacheDir(), "helloworld");
        if (!file.exists()) {
            Log.d("File", "该缓存文件不存在");
        } else {
            try {
                FileInputStream inputStream = new FileInputStream(file);
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line = reader.readLine();
                while (line != null) {
                    Log.d("helloworld", line);
                    line = reader.readLine();
                }
                reader.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这里写图片描述

外部存储

把公有的数据保存在共享的外部存储介质中
外部存储:即手机Sdcard上的存储(手机本身自带的Sdcard存储)。需要加权限:AndroidManifest.xml < uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/ >
向Sdcard中写文件:在mnt—>sdcard文件夹中

    /**
     * 向手机自带的Sdcard中存储数据
     */
    private void writeToSdcard() {
        // Environment.getExternalStorageDirectory()表示的是手机本地磁盘即sdcard的路径
        File file = new File(Environment.getExternalStorageDirectory(),"hellosdcard.txt");
        try {
            FileOutputStream outputStream = new FileOutputStream(file);
            outputStream.write("你好,本地存储".getBytes());
            outputStream.flush();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这里写图片描述

SQLite数据库存储

把结构化的数据保存在一个私有的数据库中
SQLite是小型数据库,存储容量2T
缺点:耗电,如果存储数目很少,最好不要用SQLite
操作数据库时:要继承SQLiteOpenHelper类操作数据库
SQLite是无类型的,允许忽略数据类型。

  1. 新建一个database包,存放数据库操作类MySQLiteOpenHelp继承了SQLiteOpenHelper,要实现onCreate(),onUpgrade(),还有一个构造器
/**
 * 数据库操作类,继承了SQLiteOpenHelper,要实现onCreate(),onUpgrade(),还有一个构造器
 * 自己重载了一个构造器,参数是“上下文”context和“数据库的名称”name,用this(),调用该类的构造器
 * Created by Went_Gone on 2015/9/7.
 */
public class MySQLiteOpenHelp extends SQLiteOpenHelper{
    public MySQLiteOpenHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MySQLiteOpenHelp(Context context,String name){
        this(context,name,null,1);//this()调用该类的构造器,简单
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库。
        db.execSQL("create table if not exists user (id integer primary key AUTOINCREMENT,name varchar(20),password varchar(10))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  1. 在MainActivity.java中

    • 创建数据库,声明并初始化MySQLiteOpenHelp
      创建数据库时 必须调用getWritableDatabase
      MySQLiteOpenHelp help = new MySQLiteOpenHelp(getApplicationContext(),”MY_FIRST_DB.db”);
      声明一个SQLiteDatabase对象database。
      database = help.getWritableDatabase();//必须要写,创建表
      //创建出来的数据库在dat—>data—>包名—>databases中
      这里写图片描述

    • 插入数据库 insert()方法。第一个参数表名,第二个nullColumnHack,第三个ContentValues。然后创建ContentValues,传入值。

    /**
     * 插入数据库
     */
    private void insertDataBase() {
        ContentValues values = new ContentValues();
        values.put("name",mEditTextUsername.getText().toString());
        values.put("password",mEditTextPassword.getText().toString());
        database.insert("user", null, values);//第一个参数表名,第二个nullColumnHack,第三个ContentValues
        mEditTextUsername.setText("");
        mEditTextPassword.setText("");
        Toast.makeText(getApplicationContext(), "插入了数据", Toast.LENGTH_SHORT).show();
    }

这里写图片描述这里写图片描述

  • 删除数据 delete() 第一个参数表名,第二个参数限制条件(带”?”),第三个参数”?”处的值,即查找的条件。
     /**
     * 删除数据库
     */
    private void deleteDataBase() {
        database.delete("user","name=?",new String[]{"King"});
        Toast.makeText(getApplicationContext(), "删除了数据", Toast.LENGTH_SHORT).show();
    }

点击删除数据按钮后查看数据库:这里写图片描述

  • 更新数据 updata()方法,参数: 表名,要更改后的ContextValues,更改的条件(即在哪更改),更改条件的值
    /**
     * 更新数据库
     */
    private void updataDtaBase() {
        ContentValues values = new ContentValues();
        values.put("password","abcd");
        database.update("user",values,"name=?",new String[]{"King"});//表名 要更改后的ContextValues 更改的条件(即在哪更改) 更改条件的值
        Toast.makeText(getApplicationContext(), "更新了数据", Toast.LENGTH_SHORT).show();
    }

先插入一条King的数据,password为1234。点击更新数据按钮后查看数据库:这里写图片描述

  • 查看数据库
    两种不同的方式,大体相同。rawQuery()方法与query()方法
    ①用rawQuery()查看数据库
    /**
     * 用rawQuery查找数据库
     */
    private void selectDataBaseRawQuery() {
        Cursor cursor = database.rawQuery("select * from user", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String password = cursor.getString(cursor.getColumnIndex("password"));
            Log.d("cursor", "用户名:" + name + "  密码:" + password);
            cursor.moveToNext();//记得移动到下一位
        }
    }

 /**
     * 用query查找数据库
     */
    private void selectDataBaseQuery() {
        Cursor cursor = database.query("user",null,null,null,null,null,"id ASC","1, 3");//limit :偏移量offset,数量limit
        cursor.moveToFirst();
        while (!cursor.isAfterLast()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String password = cursor.getString(cursor.getColumnIndex("password"));
            Log.d("cursor", "用户名:" + name + "  密码:" + password);
            cursor.moveToNext();//记得移动到下一位
        }
    }

对于limit 此时:刨除第一个数据,从第二个数据开始查找3个数据:
完整的表:这里写图片描述 查找到的数据:这里写图片描述

网络存储

把数据保存在网络上开发者自己的服务器中

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值