Android-读写内外部存储数据,SharePreference,PreferenceActivity,SQLite

Android的内部存储数据指的是存储于该APP包内的数据,内部存储数据则指的是存储在SD卡中的数据,现在大多数手机都已经无外置SD卡,因此这里指内置的SD卡。

SharePreference是一个轻量级的配置信息存储文件,即XML,主要存储应用的配置信息;PreferenceActivity则是将配置选项可视化,把配置信息存储在Activity中。

SQLite是Android使用的一款轻型的数据库,该数据库的设计目标是嵌入式。


读写内外部存储数据

首先增加3个EditText来键入要存储的数据和6个Button来分别写入、读取内外部存储数据、打开PreferenceActivity,增加数据到SQLITE. 如下图


定义文件名

private static final String FILE_NAME = "this is a demo file";
写内部存储数据

case R.id.bt_writeInternalData:
                try {
                    FileOutputStream fileOutputStream = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
                    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
                    outputStreamWriter.write(et_data.getText().toString());
                    outputStreamWriter.close();
                    fileOutputStream.close();
                    Toast.makeText(this, "写入内部存储成功", Toast.LENGTH_SHORT).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;

读内部存储数据

case R.id.bt_readInternalData:
                try {
                    FileInputStream fileInputStream = openFileInput(FILE_NAME);
                    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
                    char[] chars = new char[fileInputStream.available()];
                    inputStreamReader.read(chars);
                    inputStreamReader.close();
                    fileInputStream.close();
                    String string = new String(chars);
                    tv_showdata.setText(string);
                    Toast.makeText(this, "读取内部存储成功", Toast.LENGTH_SHORT).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;


读写内外部存储数据

在读写外部数据时,我们需要获取外部存储的路径Dir

File sdcardDir = Environment.getExternalStorageDirectory();
并在manifest中增加读写外部存储数据的许可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


写外部存储数据
case R.id.bt_writeExternalData:
                File file = new File(sdcardDir, FILE_NAME);
                if (!file.exists()) {
                    Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
                } else {
                    try {
                        Toast.makeText(this, "当前系统具备SD卡目录", Toast.LENGTH_SHORT).show();
                        file.createNewFile();
                        FileOutputStream fileOutputStream = new FileOutputStream(file);
                        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
                        outputStreamWriter.write(et_data.getText().toString());
                        outputStreamWriter.flush();
                        outputStreamWriter.close();
                        fileOutputStream.close();
                        Toast.makeText(this, "写入外部存储成功", Toast.LENGTH_SHORT).show();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;

读外部存储数据

case R.id.bt_readExternalData:
                file = new File(sdcardDir, FILE_NAME);
                if (file.exists()) {
                    try {
                        FileInputStream fileInputStream = new FileInputStream(file);
                        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
                        char[] chars = new char[fileInputStream.available()];
                        inputStreamReader.read(chars);
                        inputStreamReader.close();
                        fileInputStream.close();
                        String string = new String(chars);
                        tv_showdata.setText(string);
                        Toast.makeText(this, "读取外部存储成功", Toast.LENGTH_SHORT).show();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;

PreferenceActivity

再增加一个按钮来启动PreferenceActivity


case R.id.bt_perferenActivity:
                startActivity(new Intent(this,MyPreferenceActivity.class));
                break;
创建一个新的Activity并继承于PreferenceActivity,并在ONCREATE中绑定 R.xml.mypreference,它是一个XML文件,用于配置preference。
public class MyPreferenceActivity extends PreferenceActivity {
    private PreferenceManager preferenceManager;
    private CheckBoxPreference checkBoxPreference;
    private ListPreference listPreference;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.mypreference);
        preferenceManager=getPreferenceManager();
        checkBoxPreference= (CheckBoxPreference) preferenceManager.findPreference("checkbox");
        Toast.makeText(getApplicationContext(),"当前状态是:"+checkBoxPreference.isChecked(),Toast.LENGTH_SHORT).show();
        listPreference= (ListPreference) preferenceManager.findPreference("list");
        Toast.makeText(getApplicationContext(),listPreference.getEntry()+"当前环境是:"+listPreference.getValue(),Toast.LENGTH_SHORT).show();
    }
}

R.xml.mypreference

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
      android:key="checkbox"
    android:title="是否开启"
    android:summaryOn="已经开启"
    android:summaryOff="已经关闭"></CheckBoxPreference>
<ListPreference
    android:key="list"
    android:title="请选择一个选项"
    android:summary="请点击选择"
    android:entries="@array/entries"
    android:entryValues="@array/values"></ListPreference>
    <EditTextPreference
        android:key="edit"
        android:title="请输入内容"
        android:summary="请点击输入"></EditTextPreference>
    <RingtonePreference
        android:key="ringtone"
        android:title="ringtone"
        android:summary="请选择"></RingtonePreference>
    <SwitchPreference
        android:key="switch"
        android:title="是否选定"
        android:summary="请点击右侧switch"
        android:background="@android:color/holo_green_dark"
        ></SwitchPreference>
    <MultiSelectListPreference
        android:key="muliti"
        android:title="MultiSelectListPreference"
        android:entries="@array/entries"
        android:entryValues="@array/values"
        ></MultiSelectListPreference>
</PreferenceScreen>

SQLite

创建一个类来继承SQLiteOpenHelper,重写方法ONCREATE

 @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE user(" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
                "name TEXT DEFAULT \"\"," +
                "age TEXT DEFAULT \"\")");
    }

让MainActivity继承ListActivity,并在布局文件中增加一个Listview,设置其ID为android:id="@android:id/list",

再增加两个EDITTEXT用于输入数据的NAME和AGE,一个增加相应按钮。


getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()该方法定义了ITEM选项在长按情况下可以将该项数据从SQLite数据库中删除,并弹出确认窗口。

 database = new Database(this, "DB_demo", null, 1);
        dbwriter = database.getWritableDatabase();
        dbreader = database.getReadableDatabase();

        simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.database_layout, null, new String[]{"name", "age"}, new int[]{R.id.tv_name, R.id.tv_age});
        setListAdapter(simpleCursorAdapter);

        refreshListview();

        getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                new AlertDialog.Builder(MainActivity.this).setTitle("提示").setMessage("确定要删除该项吗?").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Cursor cursor = simpleCursorAdapter.getCursor();
                        cursor.moveToPosition(position);
                        int itemId = cursor.getInt(cursor.getColumnIndex("_id"));
                        dbwriter.delete("user", "_id=?", new String[]{itemId + ""});
                        refreshListview();
                    }
                }).show();
                return true;
            }
        });

private void refreshListview() {
    Cursor cursor = dbreader.query("user", null, null, null, null, null, null);
    simpleCursorAdapter.changeCursor(cursor);
}


 case R.id.bt_insertsqldata:
                if (!et_name.getText().toString().equals("") && !et_age.getText().toString().equals("")) {
                    ContentValues contentValues = new ContentValues();
                    contentValues.put("name", et_name.getText().toString());
                    contentValues.put("age", et_age.getText().toString());
                    dbwriter.insert("user", null, contentValues);
                    refreshListview();
                }
                break;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值