Android数据存储3种方式
来源:互联网 发布:初中考试软件 编辑:程序博客网 时间:2024/06/06 03:49
1、key-value 方式保存
①如果你想存储的数据是一个相对小的集合的键值,你可以使用SharedPreferences。
②使用:
定义布局:
activity_main.xml
<?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" android:orientation="vertical" tools:context="com.james.datasave.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onKeyValueSave" android:text="key-value save"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onKeyValueRead" android:text="key-value read"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onKeyValueClear" android:text="key-value clear"/></LinearLayout>
package com.james.datasave;import android.content.Context;import android.content.SharedPreferences;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity { public static final String SP_NAME = "sp_name"; public static final String SP_KEY = "sp_key"; private String defValue = "this is defValue"; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sharedPreferences = getPreferences(Context.MODE_PRIVATE); } public void onKeyValueSave(View view) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(SP_KEY, "this is save content"); editor.commit(); } public void onKeyValueRead(View view) { String readValue = sharedPreferences.getString(SP_KEY, defValue); Toast.makeText(this, readValue, Toast.LENGTH_SHORT).show(); } public void onKeyValueClear(View view){ SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.commit(); Toast.makeText(this, "清除数据成功", Toast.LENGTH_SHORT).show(); }}
记得添加读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、文件保存
①适合于读或写大量的数据
②怎么使用?
定义布局:
activity_main.xml:
<?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" android:orientation="vertical" tools:context="com.james.datasave.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onFileSave" android:text="文件保存"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onFileRead" android:text="文件读取"/></LinearLayout>
package com.james.datasave;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Toast;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;public class MainActivity extends AppCompatActivity { private String filename = "myfile"; private String handlerKey = "handlerKey"; private Handler handler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0: Toast.makeText(MainActivity.this,"无数据",Toast.LENGTH_SHORT).show(); break; case 1: String fileContent = msg.getData().getString(handlerKey); Toast.makeText(MainActivity.this,fileContent,Toast.LENGTH_SHORT).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onFileSave(View view){ new Thread(){ @Override public void run() { saveFile(); } }.start(); } public void onFileRead(View view){ new Thread(){ @Override public void run() { readFile(); } }.start(); } private void saveFile(){ String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } private void readFile(){ File file = new File(getFilesDir(), filename); //如果有这个文件并且有内容就读取文件的内容,没有不做任何操作 if(file != null && file.length() > 0){ try { //把要读取的数据new 成一个FileInputStream,建一个字节,把读到的数据放到byte数组中,再从byte数组中取出数据放到StringBuilder FileInputStream inputStream = openFileInput(filename); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuffer sb = new StringBuffer(); while ((hasRead = inputStream.read(buffer))!=-1){ sb.append(new String(buffer,0,hasRead)); } //把消息放到Bundle,再把Bundle放到Message,在用handler发送Message. Message message = new Message(); Bundle bundle = new Bundle(); bundle.putString(handlerKey,sb.toString()); message.setData(bundle); message.what = 1; handler.sendMessage(message); } catch (Exception e) { e.printStackTrace(); handler.sendEmptyMessage(0); } } }}
3、SQL保存
①数据复杂,或者涉及到查询比较复杂,可以使用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" android:orientation="vertical" tools:context="com.james.datasave.MainActivity"> <EditText android:id="@+id/id_et_title" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/id_et_content" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onSQLiteAdd" android:text="SQLite add"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onSQLiteQuery" android:text="SQLite Query"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onSQLiteDelete" android:text="SQLite delete"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onSQLiteUpdate" android:text="SQLite update"/></LinearLayout>FeedReaderContract.java
package com.james.datasave;import android.provider.BaseColumns;/** * Created by 1 on 2017/3/21. */public class FeedReaderContract { public FeedReaderContract() {} /* Inner class that defines the table contents */ public static abstract class FeedEntry implements BaseColumns { public static final String TABLE_NAME = "entry";//表名 public static final String COLUMN_NAME_ENTRY_ID = "entryid";//列id public static final String COLUMN_NAME_TITLE = "title";//列名 public static final String COLUMN_NAME_CONTENT = "subtitle";//主题 }}上面是定义表结构
FeedReaderDbHelper.java
package com.james.datasave;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by 1 on 2017/3/21. */public class FeedReaderDbHelper extends SQLiteOpenHelper { private static final String TEXT_TYPE = " TEXT";//列中数据类型 private static final String COMMA_SEP = ",";// private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + FeedReaderContract.FeedEntry.TABLE_NAME + " (" + FeedReaderContract.FeedEntry._ID + " INTEGER PRIMARY KEY autoincrement," + FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP + FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP + FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT + TEXT_TYPE+ " )";//创建表语句 private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + FeedReaderContract.FeedEntry.TABLE_NAME;//删除表,根据表名删除表 public static final int DATABASE_VERSION = 2;//数据库的版本 public static final String DATABASE_NAME = "FeedReader.db";//数据库名字 public FeedReaderDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_ENTRIES); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // This database is only a cache for online data, so its upgrade policy is // to simply to discard the data and start over db.execSQL(SQL_DELETE_ENTRIES); onCreate(db); } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { onUpgrade(db, oldVersion, newVersion); }}
package com.james.datasave;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.EditText;import static android.R.attr.id;import static com.james.datasave.FeedReaderContract.FeedEntry.TABLE_NAME;public class MainActivity extends AppCompatActivity { private FeedReaderDbHelper mDbHelper; private SQLiteDatabase db; private EditText etTitle; private EditText etContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etTitle = (EditText) findViewById(R.id.id_et_title); etContent = (EditText) findViewById(R.id.id_et_content); //创建表(定义表的结构,执行创建表的语句) mDbHelper = new FeedReaderDbHelper(this); db = mDbHelper.getWritableDatabase(); //增删改查 } //增加数据 public void onSQLiteAdd(View view) { new Thread(){ @Override public void run() { super.run(); saveData(); } }.start(); } //查找数据,把查找到的数据打印出来 public void onSQLiteQuery(View view){ String[] projection = { FeedReaderContract.FeedEntry._ID, FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT, }; String sortOrder = FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT + " DESC"; Cursor cursor = db.query(TABLE_NAME,projection,null,null,null,null,sortOrder); while (cursor.moveToNext()){ String id = cursor.getColumnName(0); String title = cursor.getString(1); String content = cursor.getString(2); Log.d("debug","id:"+id+";title:"+title+";content:"+content); } cursor.close(); } public void onSQLiteDelete(View view){ deleteData(); } /** * 更新 */ public void onSQLiteUpdate(View view){ new Thread(){ @Override public void run() { super.run(); updateData(); } }.start(); } private void updateData(){ ContentValues values = new ContentValues(); values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, "eerrrr");//更新的内容 String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT + " LIKE ?"; String[] selectionArgs = { String.valueOf("hh") };//内容是hh这一列 int count = db.update(TABLE_NAME, values, selection, selectionArgs);//更新内容是hh这一列的title为eerrrr。得保证你有hh这个内容。 } private void deleteData(){ //获取 String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE + " LIKE ?"; String[] selectionArgs = { String.valueOf("ww") };//根据COLUMN_NAME_TITLE 为ww的删除 db.delete(TABLE_NAME, selection, selectionArgs); } private void saveData(){ if(etTitle == null || etContent == null || TextUtils.isEmpty(etTitle.getText()) || TextUtils.isEmpty(etContent.getText())){ return; } String title = etTitle.getText().toString(); String content = etContent.getText().toString(); if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(content)) { SQLiteDatabase db = mDbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID, id); values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, title); values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT, content); db.insert(TABLE_NAME, FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID, values); Log.d("debug","title:"+title+";content:"+content);// Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); } }}
0 0
- android存储数据的方式3种
- android 存储数据的3种方式
- Android数据存储3种方式
- Android 数据存储方式
- android数据存储方式
- Android:数据存储方式
- Android数据存储方式
- android数据存储方式
- Android数据存储方式
- Android 数据存储方式
- Android数据存储方式
- Android 数据存储方式
- Android数据存储方式
- Android数据存储方式
- Android 数据存储方式
- Android数据存储方式
- android数据存储方式
- Android数据存储方式
- Http文件断点下载(Http请求头的Range字段)
- csdn中如何查看排名
- 如何在数据库中存储一棵树
- Java 面向对象基础
- effect C++ 确定对象被使用前先被初始化
- Android数据存储3种方式
- 移动零
- Chrome DevTools 中文文档
- 记录下 用数字对应EXECEL表头的字母
- Unity3D_uGUI学习笔记(5)_Animation Integration简述
- 大数据相关资源
- kafka跟storm收集日志解决方案
- swap file “*.swp”already exists
- MJPEG协议入门介绍