深入了解安卓系统开发中的数据存储与管理方法

深入了解安卓系统开发中的数据存储与管理方法在安卓系统开发中,数据存储与管理是至关重要的一环,随着移动应用的发展,用户数据的处理变得越来越复杂,开发者需要选择合适的数据存储与管理方法来提高应用的性能、安全性和用户体验,本文将深入探讨安卓系统开发中常用的数据存储与管理方法,包括SharedPreferences、SQLite数据库、Roo…。

深入了解安卓系统开发中的数据存储与管理方法

在安卓系统开发中,数据存储与管理是至关重要的一环。随着移动应用的发展,用户数据的处理变得越来越复杂,开发者需要选择合适的数据存储与管理方法来提高应用的性能、安全性和用户体验。本文将深入探讨安卓系统开发中常用的数据存储与管理方法,包括Shared Preferences、SQLite数据库、Room Persistence Library、以及其他一些辅助性的数据管理技术。

Shared Preferences

Shared Preferences是安卓系统中一种轻量级的数据存储方式,通常用于存储少量简单的键值对数据,比如应用的配置信息、用户偏好设置等。Shared Preferences的好处在于操作简单方便,不需要编写复杂的数据库操作语句,适用于存储一些简单的数据。由于Shared Preferences存储的数据是以XML文件的形式存储在应用的私有目录中,对于大量复杂数据的存储和管理并不适用。

SQLite数据库

SQLite数据库是安卓系统中的内置关系型数据库,广泛应用于安卓应用的数据存储与管理中。相比Shared Preferences,SQLite数据库更适合存储结构化数据和大量数据。通过使用SQL语句,开发者可以创建表格、插入、查询、更新和删除数据,实现复杂的数据操作。SQLite数据库支持事务处理,能够确保数据的完整性和一致性。但需要注意的是,直接使用SQLite数据库需要处理一些复杂的数据库操作,如表关联、索引等,对开发者的要求较高。

Room Persistence Library

为了简化SQLite数据库的操作,官方推出了Room Persistence Library,这是一个在SQLite数据库之上的抽象层,提供了更简洁和友好的API,帮助开发者更轻松地进行数据存储和管理。Room库以注解方式定义实体类、数据访问对象(DAO)和数据库,自动生成底层的SQLite数据库操作语句,减少了开发者的重复工作。使用Room库可以更快速地搭建数据库结构和实现数据操作,提高开发效率。

其他数据管理技术

除了上述常用的数据存储与管理方法外,还有一些其他辅助性的数据管理技术可以帮助开发者更好地处理数据,提升应用的性能和用户体验。比如使用Content Provider可以实现数据共享和跨应用数据访问;使用ORM(对象关系映射)框架如GreenDAO、Realm等可以简化数据操作,并将对象映射到数据库表中;使用Firebase Realtime Database或Firestore可以实现实时同步的云端数据存储等。

结论

数据存储与管理在安卓系统开发中具有重要意义,开发者需要根据应用的需要选择合适的存储与管理方法。Shared Preferences适用于存储简单的键值对数据,SQLite数据库适用于结构化数据和大量数据的存储,Room Persistence Library简化了SQLite数据库的操作,提高了开发效率。除此之外,还有其他一些辅助性的数据管理技术可以用来处理特定需求。通过合理选择和灵活运用这些数据存储与管理方法,开发者可以更好地优化应用性能,提升用户体验。


Android数据的四种存储方式

作为一个完整的应用程序,数据存储操作是必不可少的。

因此,Android系统一共提供了四种数据存储方式。

分别是: 1SharePreference 2SQLite 3ContentProvider 4File 由于Android系统中,数据基本都是私有的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用ContentProvider。

SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。

Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。

例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。

每个ContentProvider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义一个URI,然后其他的应用程序就通过ContentProvider传入这个URI来对数据进行操作。

Android中用什么方法来存储数据,最常的方式是什么? 像 QQ 微信的数据如何存储的?

Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 网络存储数据不同的业务逻辑,或者需求,用不同的实现方式,以下是这几中数据存储方式的说明用及法:第一种: 使用SharedPreferences存储数据SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。

SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。

xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。

其存储位置在/data/data/< >/shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

实现SharedPreferences存储的步骤如下:一、根据Context获取SharedPreferences对象二、利用edit()方法获取Editor对象。

三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

下面是示例代码:public class MainActivity extends Activity { @Overridepublic void onCreate(Bundle savedInstanceState) {(savedInstanceState);setContentView();//获取SharedPreferences对象Context ctx = ; SharedPreferences sp = (SP, MODE_PRIVATE);//存入数据Editor editor = ();(STRING_KEY, string);(INT_KEY, 0);(BOOLEAN_KEY, true);();//返回STRING_KEY的值Log.d(SP, (STRING_KEY, none));//如果NOT_EXIST不存在,则返回值为noneLog.d(SP, (NOT_EXIST, none));} } 这段代码执行过后,即在/data/data//shared_prefs目录下生成了一个文件,一个应用可以创建多个这样的xml文件。

SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。

但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。

所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

第二种: 文件存储数据关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

文件可用来存放大量数据,如文本、图片、音频等。

默认位置:/data/data/< >/files/***.***。

代码示例: public void save(){ try {FileOutputStream outStream=(,_WORLD_READABLE);(()()());();(,Saved,_LONG)();} catch (FileNotFoundException e) {return;}catch (IOException e){return ;}} openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。

创建的文件保存在/data/data//files目录,如: /data/data//files/ ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data//files目录就可以看到该文件。

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为_PRIVATE = _APPEND = _WORLD_READABLE = _WORLD_WRITEABLE = _PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。

可以使用__APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

_WORLD_READABLE和_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入: openFileOutput(, _WORLD_READABLE + _WORLD_WRITEABLE); android有一套自己的安全模型,当应用程序()在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。

默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。

除非在创建时指定了_WORLD_READABLE或者_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

读取文件示例:public void load(){try {FileInputStream inStream=();ByteArrayOutputStream stream=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int length=-1;while((length=(buffer))!=-1) {(buffer,0,length);} ();();(());(,Loaded,_LONG)();} catch (FileNotFoundException e) {();}catch (IOException e){return ;} } 对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定_WORLD_READABLE和_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data//cache目录 getFilesDir()方法用于获取/data/data//files目录。

把文件存入SDCard:使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。

对于像视频这样的大文件,我们可以把它存放在SDCard。

SDCard是干什么的?你可以把它看作是移动硬盘或U盘。

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。

创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用: mksdcard 2048M D:AndroidTool 在程序中访问SDCard,你需要申请访问SDCard的权限。

在中加入访问SDCard的权限如下:<uses-permission android:name=_UNMOUNT_FILESYSTEMS/><uses-permission android:name=_EXTERNAL_STORAGE/> 要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

注意:访问SDCard必须在中加入访问SDCard的权限。

if(()(_MOUNTED)){ File sdCardDir = ();//获取SDCard目录 File saveFile = new File(sdCardDir, “”);FileOutputStream outStream = new FileOutputStream(saveFile);(());(); } ()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于_MOUNTED。

()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写: File sdCardDir = new File(/sdcard); //获取SDCard目录 File saveFile = new File(sdCardDir, );//上面两句代码可以合成一句: File saveFile = new File(/sdcard/); FileOutputStream outStream = new FileOutputStream(saveFile); (()); ();第三种: SQLite数据库存储数据SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。

此外它还是开源的,任何人都可以使用它。

许多开源项目((Mozilla, PHP, Python)都使用了 SQLiteSQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。

SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。

特点: 面向资源有限的设备, 没有服务器进程, 所有数据存放在同一文件中跨平台, 可自由复制。

SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。

它的优点就是高效,Android 运行时环境包含了完整的 SQLite。

SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。

当某个值插入数据库时,SQLite 将检查它的类型。

如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。

如果不能转换,则该值将作为其本身具有的类型存储。

比如可以把一个字符串(String)放入 INTEGER 列。

SQLite 称这为“弱类型”(manifest typing.)。

此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。

除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。

Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。

对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。

但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。

因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。

数据库存储在 data/< 项目文件夹 >/databases/ 下。

Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。

下面会详细讲解如果创建数据库,添加数据和查询数据库。

创建数据库 Android 不自动提供数据库。

在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。

Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。

SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。

SQLiteOpenHelper 的子类,至少需要实现三个方法:1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。

这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。

2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。

3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

第四种 使用ContentProvider存储数据 ContentProvider其实也是通过数据库的方式来存储数据的,因此这里不再做详细介绍第五种 网络存储数据 也就是说将数据保存在服务器,android上只需要通过httpclient发起一个请求,向服务器获取数据即可

Android系统中的SQLite数据库是如何使用的

Android系统中的SQLite数据库是如何使用的?SQLite数据库是Android系统中最常用的数据库,它可以方便地存储和管理数据,使得开发者可以轻松地在应用程序中实现数据持久化。

本文将介绍Android系统中如何使用SQLite数据库。

1.创建SQLite数据库要使用SQLite数据库,首先需要创建一个数据库。

可以使用SQLiteOpenHelper来创建数据库。

SQLiteOpenHelper是一个抽象类,它提供了四个方法:onCreate:当数据库第一次创建时调用。

在这个方法中,开发者可以执行创建表等操作。

onUpgrade:当数据库升级时调用。

在这个方法中,开发者可以执行更改表结构等操作。

onOpen:当数据库被打开时调用。

getWritableDatabase和getReadableDatabase:分别返回可读写和只读的SQLiteDatabase对象。

2.执行SQL操作可以使用SQLiteDatabase对象来执行SQL操作。

可以执行一些简单的SQL操作,例如插入、更新、删除和查询等。

插入数据:SQLiteDatabasedb=();ContentValuesvalues=newContentValues();(name,张三);(user,null,values);更新数据:SQLiteDatabasedb=();ContentValuesvalues=newContentValues();(name,李四);(user,values,id=?,newString[]{(1)});删除数据:SQLiteDatabasedb=();(user,id=?,newString[]{(1)});查询数据:SQLiteDatabasedb=();Cursorcursor=(user,null,null,null,null,null,null);while(()){intid=((id));Stringname=((name));}3.使用ContentProvider管理数据在Android系统中,ContentProvider是一个重要的组件,可以用来管理数据。

可以通过ContentProvider让其他应用程序访问应用程序的数据。

要创建ContentProvider,需要继承ContentProvider类,并实现query、insert、update和delete方法。

在这些方法中,开发者可以执行查询、插入、更新和删除操作。

总结:使用SQLite数据库要分为三步:创建数据库、执行SQL操作和使用ContentProvider管理数据。

SQLite数据库是Android系统中最常用的数据库之一,它是一个轻量级的数据库,非常适合在移动设备上使用。

开发者可以使用SQLite数据库来存储用户数据、缓存数据等。

使用SQLite数据库可以帮助开发者轻松地实现数据持久化,提高应用程序的稳定性和效率。

安卓开发:Android创建和使用数据库详细指南

数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhone也是使用SQLite来存储数据的。

在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/ /databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。

SQLite数据库使用Eclipse创建一个Android项目,取名为Database,如图1所示:创建DBAdapter辅助类操作数据库的最佳实践是创建一个辅助类,由它封装所有对数据库的复杂访问,对于调用代码而言它是透明的,因此我创建了一个DBAdapter的辅助类,由它创建、打开、关闭和使用SQLite数据库。

首先,在src/
文件夹(在这个例子中是src/)下添加一个文件。

在文件中,导入所有你要使用到的命名空间:package ;import ;import ;import ;import ;import ;import ;import ;public class DBAdapter{}接下来创建一个数据库,取名为bookstitles,字段如图2所示。

在文件中,定义清单1中的常量。

清单1 定义文件中的常量package ;import ;import ;import ;import ;import ;import ;import ;public class DBAdapter{public static final String KEY_ROWID = _id;public static final String KEY_ISBN = isbn;public static final String KEY_TITLE = title;public static final String KEY_PUBLISHER = publisher;private static final String TAG = DBAdapter;private static final String DATABASE_NAME = books;private static final String DATABASE_TABLE = titles;private static final int DATABASE_VERSION = 1;private static final String DATABASE_CREATE =create table titles (_id integer primary key autoincrement,+ isbn text not null, title text not null,+ publisher text not null);;private final Context context;}DATABASE_CREATE常量包括创建titles表的SQL语句。

在DBAdapter类中,你可以扩展SQLiteOpenHelper类,它是一个Android辅助类,主要用于数据库创建和版本管理。

实际上,你可以覆盖onCreate()和onUpgrade()方法,如清单2所示。

清单2 在DBAdapter类中,扩展SQLiteOpenHelper类覆盖onCreate() 和 onUpgrade()方法package ;import ;import ;import ;import ;import ;import ;import ;public class DBAdapter{public static final String KEY_ROWID = _id;public static final String KEY_ISBN = isbn;public static final String KEY_TITLE = title;public static final String KEY_PUBLISHER = publisher;private static final String TAG = DBAdapter;private static final String DATABASE_NAME = books;private static final String DATABASE_TABLE = titles;private static final int DATABASE_VERSION = 1;private static final String DATABASE_CREATE =create table titles (_id integer primary key autoincrement,+ isbn text not null, title text not null,+ publisher text not null);;private final Context context;private DatabaseHelper DBHelper;private SQLiteDatabase db;public DBAdapter(Context ctx){ = ctx;DBHelper = new DatabaseHelper(context);}private static class DatabaseHelper extends SQLiteOpenHelper{DatabaseHelper(Context context){super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db){(DATABASE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion){Log.w(TAG, Upgrading database from version + oldVersion+ to+ newVersion + , which will destroy all old data);(DROP TABLE IF EXISTS titles);onCreate(db);}}}onCreate()方法创建一个新的数据库,onUpgrade()方法用于升级数据库,这可以通过检查DATABASE_VERSION常量定义的值来实现,对于onUpgrade()方法而言,只不过是简单地删除表,然后在创建表而已。

#p#副标题#e#现在你可以定义不同的方法来打开和关闭数据库,如清单3中的添加/编辑/删除/行的函数。

清单3 定义打开和关闭数据库以及增加/编辑/删除表中行的方法public class DBAdapter{//…//…//—打开数据库—public DBAdapter open() throws SQLException{db = ();return this;}//—关闭数据库—public void close(){();}//—向数据库插入一个标题—public long insertTitle(String isbn, String title, String publisher){ContentValues initialValues = new ContentValues();(KEY_ISBN, isbn);(KEY_TITLE, title);(KEY_PUBLISHER, publisher);return (DATABASE_TABLE, null, initialValues);}//—删除一个指定的标题—public boolean deleteTitle(long rowId){return (DATABASE_TABLE, KEY_ROWID + = + rowId, null)0;}//—检索所有标题—public Cursor getAllTitles(){return (DATABASE_TABLE, new String[] {KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},null,null,null,null,null);}//—检索一个指定的标题—public Cursor getTitle(long rowId) throws SQLException{Cursor mCursor =(true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},KEY_ROWID + = + rowId,null,null,null,null,null);if (mCursor != null) {();}return mCursor;}//—更新一个标题—public boolean updateTitle(long rowId, String isbn,String title, String publisher){ContentValues args = new ContentValues();(KEY_ISBN, isbn);(KEY_TITLE, title);(KEY_PUBLISHER, publisher);return (DATABASE_TABLE, args,KEY_ROWID + = + rowId, null)0;}}Database;import ;import ;import ;import ;import ;import ;import ;public class DBAdapter{public static final String KEY_ROWID = _id;public static final String KEY_ISBN = isbn;public static final String KEY_TITLE = title;public static final String KEY_PUBLISHER = publisher;private static final String TAG = DBAdapter;private static final String DATABASE_NAME = books;private static final String DATABASE_TABLE = titles;private static final int DATABASE_VERSION = 1;private static final String DATABASE_CREATE =create table titles (_id integer primary key autoincrement,+ isbn text not null, title text not null,+ publisher text not null);;private final Context context;private DatabaseHelper DBHelper;private SQLiteDatabase db;public DBAdapter(Context ctx){ = ctx;DBHelper = new DatabaseHelper(context);}private static class DatabaseHelper extends SQLiteOpenHelper{DatabaseHelper(Context context){super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db){(DATABASE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion){Log.w(TAG, Upgrading database from version + oldVersion+ to+ newVersion + , which will destroy all old data);(DROP TABLE IF EXISTS titles);onCreate(db);}}//—打开数据库—public DBAdapter open() throws SQLException{db = ();return this;}//—关闭数据库—public void close(){();}//—向数据库中插入一个标题—public long insertTitle(String isbn, String title, String publisher){ContentValues initialValues = new ContentValues();(KEY_ISBN, isbn);(KEY_TITLE, title);(KEY_PUBLISHER, publisher);return (DATABASE_TABLE, null, initialValues);}//—删除一个指定标题—public boolean deleteTitle(long rowId){return (DATABASE_TABLE, KEY_ROWID += + rowId, null)0;}//—检索所有标题—public Cursor getAllTitles(){return (DATABASE_TABLE, new String[] {KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},null,null,null,null,null);}//—检索一个指定标题—public Cursor getTitle(long rowId) throws SQLException{Cursor mCursor =(true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},KEY_ROWID + = + rowId,null,null,null,null,null);if (mCursor != null) {();}return mCursor;}//—更新一个标题—public boolean updateTitle(long rowId, String isbn,String title, String publisher){ContentValues args = new ContentValues();(KEY_ISBN, isbn);(KEY_TITLE, title);(KEY_PUBLISHER, publisher);return (DATABASE_TABLE, args,KEY_ROWID + = + rowId, null)0;}}注意Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。

清单4显示了完整的源代码。

清单4 完整源代码package 2develop.#p#副标题#e#

安卓数据会存本地吗

安卓开发之数据存储在本地的四种方式本地数据存储,在安卓开发过程中是不可避免的一个话题。

这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据。

基本上我们有4种方法可以存储安卓程序的数据。

第1种是Shared Preference(共享选项)。

这种方法适合于存储一些基本数据类型的数据。

他提供的是key-value(键值)的方式。

键必须是字符串类型的,值可以是布尔型的,浮点型的,整型的,长整型的,或者字符串类型的。

这种方式是用一个xml文件在私有的目录里面存放这些数据的。

一个程序可以有多个这样的文件。

下面一段代码用来描述写入数据。

第2种是Internal Storage(内部存储)。

这种方式用来存储一些复杂的数据结构。

因为是内部存储方式,所以其他程序无法访问。

这样可以保证数据的安全性。

当你的程序卸载以后,这些内部存储数据也会被清除掉。

这类数据一般包括像一些对象,或者本地需要一些类似文件系统访问模式的数据。

下面一段代码用来写入数据。

第3种是External Storage(外部存储)。

这种存储方式用来存储一些文件对象。

这些文件可以被其他程序来访问。

要使用外部存储,需要申请特别的写权限WRITE_EXTERNAL_STORAGE。

如果其他程序需要访问这些外部存储数据的话,也需要申请读权限READ_EXTERNAL_STORAGE 。

从安卓4.4开始,用户可以把自己的数据写入一个私有的外部存储文件夹中,如果这样的话,用户就不需要申请写权限WRITE_EXTERNAL_STORAGE。

当用户卸载程序的时候,这个文件夹也会被清除。

从安卓7.0开始, 安卓程序可以申请访问特定的文件目录,而不是申请访问整个外部存储空间。

这样可以保证数据的安全性,防止误操作。

用户只可以访问图片目录,或者文档目录。

第4种是SQLite database(数据库)。

这种方式需要了解一些数据库方面的知识。

适合存储相对结构化的数据。

尤其是表结构。

数据库是跟当前程序绑定的其他程序无法访问。

下面一段代码用来展示写入数据。

这里是丁哥开讲,欢迎留言进行进一步的讨论,谢谢。

与此同时请关注一下我们的合作伙伴。

安卓内外部存储完全解析 — 别再弄混了

安卓开发离不开手机存储,然而大部分人对于安卓开发中的存储概念存在误区,内部外部SD卡傻傻分不清?

以下引用来自对 官方文档 的理解

呵呵呵,先别说话,然而重点来了(敲黑板),按照官方的说法,

内部存储是指系统的存储空间,没有root是访问不到的呦亲,比如sharedPreferenced或者database都是保存在这里面的。

外部存储,又分为 2 部分:

然而现实中,常常有同事把手机那个32G,64G存储叫做内部存储= =,宝宝好累,人家明明是 ExternalStorage !!

希望本篇能让大家对内外部存储有一个正确鲜明的认识

getFilesDir()

路径如下

文档 云:若想操作该路径,你需要一个输出流:

就像这样:

注: this 是 context 对象

路径下会看到新文件哦

如果你还想读取的话, 文档 云:你需要一个输入流:

Log如下

getCacheDir()

文档 云:

路径如下:

特别的,还有getDir() :

getDir(- -!, _PRIVATE)()

路径如下:

app_是系统自己加上去的

内部存储就是系统的存储,没有root你是看不到的,内部存储最大特点就是可以用Context对象调用各个获取路径的方法。比如: () 那就是

下的文件遍历。

而 deleteFile(ABC) 就是

删除下名为 ABC 的文件 </br></br></br>

操作外部存储你首先需要以下权限

当你申请了write权限,那么read权限默认也就通过啦

再判断状态:

这个路径根据手机厂家不同会有些许变化

直接传入 Environment 中的常量获取相应的路径,如下:

(_ALARMS));

或者

(_PICTURES));

公有目录下,系统会区分不同类别 (例如铃声在系统设置中显示为铃声而不是音乐)

4.4以后访问该目录不再需要权限了

getExternalFilesDir(String type)

特别的:ContextCompat下的

(context,type)

返回一个File[],在4.4以后第一条数据默认外部主存储目录,第二条数据就是sd卡路径啦,但是注意4.4之前是没有第二条数据的哦

该目录下的特点是卸载程序后,该目录和其下所有文件均会被删除

getExternalCacheDir()

注意,使用该目录注意管理空间,你不能等系统帮你清理,而是自己清理不再需要的缓存

特别的:ContextCompat下的

道理同上

发现特点了吗朋友,无论外部内部,只有路径中有包名,那么就是私有的,而且是随着程序的卸载而被删除的, 有包名的路径均是Context中的方法,而公有的路径均是Environment调用的

这个货真真是要了老命,一般的方法根部不好使,结合网上有的方法加上公司项目中的方法,总结如下:

百分百好用的获取SD卡路径方法:

最后集合 path 中的值就是SD卡根目录

虽然无视版本百分百好用,但是如果你的手机有SD卡槽却没插SD卡,该方法最后 path 返回的是 null ,也就是说该方法无法判断到底是没插SD卡还是根本不支持SD卡

其实还有一种方法

String path = (SECONDARY_STORAGE);

该方法只要你手机支持SD卡,无论你插没插SD卡,均会返回SD卡路径,但是 6.0及以上该方法被移除

Environment中源码其实就是根据这个方法获取路径的

安卓官方文档大家一定要看,他就是我们开发者的权威呀,圣经呀!!

文章版权声明

 1 原创文章作者:汇维网,如若转载,请注明出处: https://www.52hwl.com/109520.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年2月19日 上午12:23
下一篇 2024年2月19日 上午12:25