Android 五种存储方式

本文深入探讨了Android应用中的数据存储方法,包括文件存储、SharePreferences、SQLite数据库、ContentProvider等内容,并详细介绍了各方法的应用场景及操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 . 文件存储

FileOutputStream out = openFileOutput("data",Context.MODE_PRIVATE);

BufferedWriter writer = new BufferedWriter(new OutputStream(out));

String  s ;

writer.writer(s);

 

二. sharePreferences 存储 (键值对形式)

  方法 1. Context 类中的getSharedPreferences("文件名字",操作模式) 方法

    操作模式一般两种 :

      MODE_PRIVATE 只允许本进程使用

      MODE_MULTI_PROCESS ('mʌltɪ)多的进程

  方法 2. Activity类中的getSharedPreferences(操作模式) 方法

  方法 3. PreferenceManager类中的getSharedPreferences()方法

 

写: 

SharedPreferences.Editor  editor = PreferenceManager.getDefaultSharedPreferences(context).edit();

editor.putString("key",value);

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

prefs.get("key","没有值时候默认")

  

三.  SQLite

  1.首先要创建一SQLiteOpenHelper数据库的辅助类,类中有a,b两个方法

/*
a. onCreate()用于创建表 ,如

Public void onCreate(SQLiteDatabase db){

	db.execSQL(创建表语句)

}

b.onUpgrade()
*/



public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
        //context:应用的上下文
        //name:数据库的名称
        //factory:创建游标的工厂
        //version:数据库的版本
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

//在数据库首次被创建时调用
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }
//在数据库升级时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

  2.创建一个打开或现有的数据库

SQLiteOpenHelper  msh = new SQLiteOpenHelper(content或this,DB_name,null,Version版本);

SQLiteDatabase db = msh.getwritableDatabase()

  3.添加数据

//方法一:  ContentValue类似hashMap

ContentValues contentValues = new ContentValues();

contentValues.put("key",values);

db.insert("表名",条件或null,contentValues)



//方法二:自己写的SQL语句
//执行 sql 语句
db.execSQL("insert into students values(null,?,?)",new Object[]{st.getName(),st.getSex()});

  4.查询数据

//方法一:系统api
Cursor cursor = db.query("表名",null,null,null,null,null,null);

if(cursor.moToFirst()){

	String data = cursor.getString(cursor.getColumnIndex("data"));

}while(cursor.moveToNext);

cursor.close();



//方法二:自己写的SQL语句
// select * from users where id=?
//叫做 游标 , 与 javaweb 中所学的  resultSet 结构是一样的  
Cursor cursor = db.rawQuery("select * from students where _id=?", new String[]{id});

  5. 改正数据

//拿到数据库
SQLiteDatabase db = helper.getWritableDatabase();

//方法1:自己写的SQL语句
db.execSQL("update students set name=?,sex=? where _id=?", new Object[]{st.getName(),st.getSex(),st.getId()});

//方法2:系统API
ContentValues values = new ContentValues();
values.put("name", st.getName());
values.put("sex", st.getSex());

db.update("students", values, "_id=?", new String[]{st.getId()});

//db.update("表名",values,"data=?",new String[]{"new data"});

  6.删除数据

//方法1:自己写的SQL语句
db.execSQL("delete from students where _id=?",new Object[]{id});

//方法2:系统API
db.delete("students", "_id=?", new String[]{id});

//db.update("表名","pages>?",new String[]{"500"}); //删除pages大于500的表

  

四. ContentProvide共享数据的存储

  注意 : 通过 Context 中的 getContentResolver()方法获取到该类的实例, Uri对象来查询表中的数据

    Uri 可以是 ContactsContract.CommonDataKinds.Phone.CONTENT_URI(读取联系人的权限)

  1.内容 URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path)

    authority : 包名 + provider 比如 com.example.app.provider

    path : 表名 比如table1

    头部加上协议声明

//URI 标准的格式写法:content://com.example.app.provider/table1
Uri uri = Uri.parse("content://com.example.app.provider/table1")

  

  2.创建数据

ContentValues values = new ContentValues();
values.put("column1", "text");
getContentResolver().insert(uri, values);

 

  3.查询数据  

Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);

if (cursor != null) {
	while (cursor.moveToNext()) {
	String column1 = cursor.getString(cursor.getColumnIndex("column1"));

	}  

        cursor.close();
}

  

  4.修改数据

getContentResolver().update(uri, values, "column1 = ? and column2 = ?", newString[] {"text", "1"});

  

  5.删除数据

getContentResolver().delete(uri, "column1 = ?", new String[] { "1" });

  

四(2)  自定义ContentProvider

  1. 自定义类继承ContentProvider类,重新 onCreate() , query() , insert() ,update() , delete() , getType() 方法

    自定义不用uri.parse(),但是首先要对比uri是否相等 uriMatcher.match(传入的uri) ,其次getType()是根据uri相等,返回 Uri 对象所对应的 MIME类型 .

  MIME类型的规定 :
    1. 必须以 vnd 开头。
    2. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。
    3. 最后接上 vnd.<authority>.<path>。比如vnd.android.cursor.dir/vnd.com.example.app.provider.table1

  2. manifest.xml 文中声明

<provider

    android:name = "比如com.example.databasetest.DatabaseProvider"

    android:anthorities = "比如com.example.databasetest.provider"

/>

 

五.

通过网路的空间存储数据,比如上传文件和下载文件,有比如 用户资料的上传和下载核对

转载于:https://www.cnblogs.com/znyyjk/p/5269190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值