Android持久化存储练习

前言

安卓文件内/外存储路径的获取:

方法作用
Environment.getDataDirectory()获取内部存储的根路径
getFilesDir()获取某个应用在内部存储中的files路径 *
getCacheDir()获取某个应用在内部存储中的cache路径
Environment.getExternalStorageDirectory()获取外部存储的根路径
getExternalFilesDir()获取某个应用在外部存储中的files路径
getExternalCacheDir()获取某个应用在外部存储中的cache路径

以上方法用来获取内/外部存储路径,其中带*的方法在使用context.openFileInput()context.openFileOutput()时可以直接访问到该文件目录,且方法返回的是FileInputStreamFileOutputStream对象。

参考:安卓内/外存储路径

一、SD卡存储

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".sdcardActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_writer_to_sdcard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="往SD卡写数据"/>
    <Button
        android:id="@+id/btn_reader_from_sdcard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取SD卡数据"/>

    <TextView
        android:id="@+id/tv_show"
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:gravity="center"
        android:text="hello"/>


</LinearLayout>
//找到控件
private void initView() {
        mBtnWriter = this.findViewById(R.id.btn_writer_to_sdcard);
        mBtnReader = this.findViewById(R.id.btn_reader_from_sdcard);
        mTvShow = this.findViewById(R.id.tv_show);
    }
//设置点击事件监听
 private void initLinstener() {
        mBtnWriter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                writeToSDcard(); //实现存储
            }
        });
        mBtnReader.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                readFromSDcard();  //实现数据读取
            }
        });
    }

private void writeToSDcard() {
    //获取外部存储根目录  即/storage/emulated/0
        File filePath = Environment.getExternalStorageDirectory();
    //Log.d(TAG,"dir = " +filePath);  可以打印日志查看路径
        File file = new File(filePath,"info.text");

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(file);
            fos.write("我是往SD卡中写入的数据".getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  private void readFromSDcard() {
        FileInputStream fis ;
        File filedir = Environment.getExternalStorageDirectory();
        File file = new File(filedir,"info.text");
        try {
            fis = new FileInputStream(file);
            BufferedReader bfr = new BufferedReader(new InputStreamReader(fis));
            String info = bfr.readLine();
            mTvShow.setText(info);  //文件中读取数据,然后设置TextView的内容
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

二、SharedPreference

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SharedprefsActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_sharedPrefs_write"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="存储数据"/>
    <Button
        android:id="@+id/btn_sharedPrefs_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="数据读取"/>
    <TextView
        android:id="@+id/tv_sharedPrefs_show"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:text="hello"
        android:gravity="center"/>

</LinearLayout>
 private void initView() {
        mBtnWrite = this.findViewById(R.id.btn_sharedPrefs_write);
        mBtnRead = this.findViewById(R.id.btn_sharedPrefs_read);
        mTvShow = this.findViewById(R.id.tv_sharedPrefs_show);
    }

private void initLinstener() {
        mBtnWrite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPrefswrite();
            }
        });
        mBtnRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPrefsread();
            }
        });
    }

 private void SharedPrefswrite() {
     //this指当前的context    
     // 路径  /data/data/包名/shared_prefs/info.text
     //MODE_PRIVATE  当前存储的数据只属于当前这个应用
        mSharedPreferences = this.getSharedPreferences("info.text", MODE_PRIVATE);
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        editor.putString("writed","我是在sharedPrefs中写入的数据");
        editor.commit();  //提交
    }

    private void SharedPrefsread() {
        //获取数据,默认hello
        String string = mSharedPreferences.getString("writed", "hello");
        mTvShow.setText(string);
    }

三、SQLite

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SqliteActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库"/>
    <Button
        android:id="@+id/btn_write_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="存储数据"/>
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       >
       <Button
           android:id="@+id/btn_insert"
           android:layout_width="0dp"
           android:layout_height="50dp"
           android:layout_weight="1"
           android:text="插入"/>
       <Button
           android:id="@+id/btn_delete"
           android:layout_width="0dp"
           android:layout_height="50dp"
           android:layout_weight="1"
           android:text="删除"/>
       <Button
           android:id="@+id/btn_update"
           android:layout_width="0dp"
           android:layout_height="50dp"
           android:text="更新"
           android:layout_weight="1" />
       <Button
           android:id="@+id/btn_query"
           android:layout_width="0dp"
           android:layout_height="50dp"
           android:text="查询"
           android:layout_weight="1"/>
   </LinearLayout>
   <TextView
       android:id="@+id/tv_database_show"
       android:layout_width="match_parent"
       android:layout_height="150dp"
       android:text="hello"
       android:gravity="center"/>

</LinearLayout>

Constans类,存放常量

public class Constants {
    public static final String DATABASE_NAME = "myAndroid.db";
    public static final int VERSION_CODE = 1;
    public static final String TABLE_NAME = "user";
}

Helper类,负责数据库创建

//SQLiteOpenHelper是一个抽象类,要使用它需要继承
public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String TAG = "MyDatabaseHelper";
    //参数分别是,传入的上下文,数据库名称,游标工厂,数据库版本号
    public MyDatabaseHelper(@Nullable Context context ) {
        super(context, Constants.DATABASE_NAME, null, Constants.VERSION_CODE);
    }

    /**
     * 数据库第一次被创建时调用,在这里可以进行表的初始化
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库时的回调
        Log.d(TAG,"创建数据库");
        String sql = "create table " + Constants.TABLE_NAME+ "(id integer,name varchar,age integer,salary integer)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //升级数据库时的回调
        Log.d(TAG,"升级数据库");
        //升级数据库需要更改version号,Constants中的版本号大于当前版本号时才会调用该方法
        String sql = "alter table " + Constants.TABLE_NAME + " add phone integer";
        db.execSQL(sql);
        }
}

DAO类,封装对数据库的操作

public class DAO {

    private static final String TAG = "DAO";
    private final MyDatabaseHelper mHelper;

    public DAO(Context context){
        //创建数据库
        //DAO类创建Helper对象并传入context
        mHelper = new MyDatabaseHelper(context);
    }
    public void initDB() {  //初始化表中的数据
        SQLiteDatabase db = mHelper.getWritableDatabase();
        String sql = "insert into " + Constants.TABLE_NAME + "(id,name,age,salary) values(?,?,?,?)";
        db.execSQL(sql,new Object[]{1,"chen",22,13000});
        db.execSQL(sql,new Object[]{3,"wang",23,12000});
        db.execSQL(sql,new Object[]{10,"li",28,20000});
        db.close();
    }

    public void insert() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        ContentValues value = new ContentValues();
        value.put("id",2);
        value.put("name","page");
        value.put("age",60);
        value.put("salary",20);
        //使用API来操作数据库
        db.insert(Constants.TABLE_NAME,null,value);
        db.close();
    }

    public void delete() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        String sql = "delete from " + Constants.TABLE_NAME + " where age = 28";
        db.execSQL(sql);
        db.close();
    }

    public void update() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        String sql = "update " + Constants.TABLE_NAME + " set salary = 20 where age = 23";
        db.execSQL(sql);
        db.close();
    }

    public String[] query() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        String sql = "select * from " + Constants.TABLE_NAME;
        //cursor游标,指向查询结果的一行
        Cursor cursor = db.rawQuery(sql, null);
        List<String> list = new ArrayList<>();
        while(cursor.moveToNext()) {
            //获取该行中的每一个字段
            int id = cursor.getInt(0);
            String name = cursor.getString(1);
            int age = cursor.getInt(2);
            int salary = cursor.getInt(3);
            list.add(id +" "+ name  +" "+ age  +" "+ salary);
        }
        cursor.close();
        db.close();
        return list.toArray(new String[list.size()]);
    }
}

Activity中负责对点击事件的处理

//Activity实现OnClickListener接口,重写onClick方法
@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create_database:
                mDao = new DAO(this);  
                mTvDBshow.setText("创建数据库成功");
                break;
            case R.id.btn_write_database:
                mDao.initDB();
                mTvDBshow.setText("初始化数据库成功");
                break;
            case R.id.btn_insert:
                if (mDao != null) {
                    mDao.insert();
                }else {
                    mTvDBshow.setText("请先创建数据库");
                }
                break;
            case R.id.btn_delete:
                if (mDao != null) {
                    mDao.delete();
                }else {
                    mTvDBshow.setText("请先创建数据库");
                }
                break;
            case R.id.btn_update:
                if (mDao != null) {
                    mDao.update();
                }else {
                    mTvDBshow.setText("请先创建数据库");
                }
                break;
            case R.id.btn_query:
                if (mDao != null) {
                    mTvDBshow.setText(Arrays.toString( mDao.query()));
                }else {
                    mTvDBshow.setText("请先创建数据库");
                }
                break;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值