android:关于存储,SharedPreferences与SQLiteOpenHelper,这一篇就够了

本文总结了Android中两种常见的数据存储方式:SharedPreferences和SQLite数据库。SharedPreferences提供轻量级的存储,支持六种数据类型,通过getSharedPreferences()或getPreferences()获取对象,并通过Editor进行数据修改和提交。SQLite则用于更复杂的数据存储需求。

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

android存储数据方式总结:

  • SharedPreferences轻量级存储框架
  • SQLite数据库存储
  • 文件存储

第一种:SharedPreferences存储数据

SharedPreferences 轻量级的存储信息的api 可以保存的数据类型有限六种

  • boolean
  • int
  • long
  • float
  • String
  • Set
获取SharedPreferences 对象的方法:

getSharedPreferences() ,getPreferences(),两者都能获取到SharedPreferences 对象。
因为SharedPreferences 本身是一个接口,程序无法直接获得SharedPreferences 实例,所以需要用到Context的方法getSharedPreferences (),
常用的getSharedPreferences(),用到两个参数,第一个用于XML指定名称,第二个用于指定模式。

第二个参数作用
Context.MODE_PRIVATE指定该SharedPreferences数据只能被本应用程序读、写。
Context.MODE_WORLD_READABLE指定该SharedPreferences数据能被其他应用程序读,但不能写。
Context.MODE_WORLD_WRITEABLE定该SharedPreferences数据能被其他应用程序读,写

SharedPreferences 对象本身只能获取数据而不能修改和存储数据,要修改和存储需要获取Editor对象
用SharedPreferences.edit()方法获取Editor对象,Editor对象有如下方法:
clear() 清空数据
putXXX() 存入指定数据
remove() 删除指定key的数据
commit() 提交数据
apply()提交数据
apply和commit方法的异同,点击这里
如下代码演示SharedPreferences 的基本使用

public class MainActivity extends AppCompatActivity {
    private  String MY_PRI_NAME = "My Preferences";
    private  String MY_KEYS_STR = "KEY_String";
    private  String My_KEYS_INT = "KEY_Int";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //用getSharedPreferences方法获取sp对象,第一个参数用来提供名称,第二个参数用来指定模式
        SharedPreferences preferences = getSharedPreferences(MY_PRI_NAME, Context.MODE_PRIVATE);
        //要添加数据必须获取Editor对象,用.edit()方法获得
        SharedPreferences.Editor edit = preferences.edit();
        //putXXX添加数据,参数为key,value形式
        edit.putString(MY_KEYS_STR,"这是第一条String数据");
        edit.putInt(My_KEYS_INT,66666);
        //.commit()方法也可以提交,略有区别,用apply效率略高
        edit.apply();
    }
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">onStop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">onStop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//获取Preferences对象</span>
    SharedPreferences preferences <span class="token operator">=</span> <span class="token function">getSharedPreferences</span><span class="token punctuation">(</span>MY_PRI_NAME<span class="token punctuation">,</span> Context<span class="token punctuation">.</span>MODE_PRIVATE<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//用contains方法判断是否 存在键值对应的数据,然后getXXX获取,第二个参数用来指定默认值</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>preferences<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span>MY_KEYS_STR<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>MY_KEYS_STR<span class="token operator">+</span><span class="token string">":"</span><span class="token operator">+</span>preferences<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span>MY_KEYS_STR<span class="token punctuation">,</span><span class="token string">"NULL"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>preferences<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span>My_KEYS_INT<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>My_KEYS_INT<span class="token operator">+</span><span class="token string">":"</span><span class="token operator">+</span>preferences<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>My_KEYS_INT<span class="token punctuation">,</span><span class="token number">777</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

SharedPreferences的使用范围:保存轻量级的数据,格式比较简单的数据,比如各种配置信息之类的。保存在xml文档中,存储格式为键值对。

SQLite数据库

SQLite是一个轻量级的数据库,android内置,占用资源少,可以支持标准的sql语言,

创建数据库

创建数据库需要SQLiteopenHelper这个抽象类,通过创建一个类继承它并且重写它的两个抽象方法onCreate()和onUograde(),可以实现创建,升级数据库的逻辑。
以下代码演示了继承SQLiteopenHelper这个类:

public class MyHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String DATABASE_NAME =  "database.db";
    public MyHelper(@Nullable Context context) {
        //上下文,数据库名称,游标工厂(没有可以传入null),数据库版本
        super(context, DATABASE_NAME, null, VERSION);
    }
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onCreate</span><span class="token punctuation">(</span>SQLiteDatabase db<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token comment">//这里写数据库初次创建的代码</span>
    db<span class="token punctuation">.</span><span class="token function">execSQL</span><span class="token punctuation">(</span><span class="token string">"create table Demo"</span><span class="token operator">+</span><span class="token string">"(_id integer primary key,name,adders)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"table is create"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onUpgrade</span><span class="token punctuation">(</span>SQLiteDatabase db<span class="token punctuation">,</span> <span class="token keyword">int</span> oldVersion<span class="token punctuation">,</span> <span class="token keyword">int</span> newVersion<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token comment">//这里写数据库升级时的代码</span>

<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
获取数据库对象

创建好后可以再要用操作数据库的位置创建该类的实例

MyHelper myHelper = new MyHelper(MainActivity.this);

 
 
  • 1

然后可以获取数据库对象然操作,这里有两个方法

方法名用法
getWriableDatabase()以读写方式打开数据库,当存储空间满的时候,就会抛出异常
getReadableDatabase()也是以读写方式打开数据库,存储空间满的时候,就会以只读方式打开,当空间问题解决时候,会关闭数据库对象再返回一个可读写对象,该方法内部调用了getWriableDatabase()方法,是对这个方法的一种封装
SQLiteDatabase database = myHelper.getReadableDatabase();

 
 
  • 1
用数据库对象操作数据库

用获取到的数据库对象来进行增删改查等操作
比如执行原生sql语句:

database.execSQL("这是一条SQL语句");

 
 
  • 1

当然查询语句建议使用rawQuery

String sql = "select * from Demo where id = ?";
Cursor cursor = database.rawQuery(sql,new String[]{"1"} );

 
 
  • 1
  • 2

这个方法会返回一个cursor(游标)对象,

这里是对于cursor的介绍

还有就是SQLiteDatabase 类提供了一系列增删改查的方法,不需要手写原生sql语句:

改update():

包含四个参数

参数说明
table数据表的名字
values值名,是一个ContentValues实例
whereClausewhere后面的条件,值用‘?’代替
whereArgswhere后面的参数,顶替上一个参数中的’?’,一般用new String[] {“这是值”}这样的形式

演示:

        database.update("Demo",values, "id=?", new String[]{"1"});

 
 
  • 1
删delete():

包含三个参数

参数说明
table数据表的名字
whereClausewhere后面的条件,值用‘?’代替
whereArgswhere后面的参数,顶替上一个参数中的’?’,一般用new String[] {“这是值”}这样的形式
 database.delete("Demo","id=?", new String[]{"3"});

 
 
  • 1
查query():

query()方法参数太多,这里找个外援
我是外援

public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,`在这里插入代码片`
            String orderBy)

 
 
  • 1
  • 2
  • 3

SQLite数据库就到这里,下面是文件存储

算了下次写吧,再见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值