安卓学习之数据存储与访问
(完整版)Android大数据的存储和大数据的访问
南昌航空大学实验报告二0 一 4 年11月14 日课程名称:An droid 实验名称:________ A n droid 数据存储和数据访问__________________ 班级:________ 姓名:_同组人:_____________________________________指导教师评定:_________________________________________ 签名: _________________________ 一:实验目的掌握SharedPreferences的使用方法;掌握各种文件存储的区别与适用情况;了解SQLite数据库的特点和体系结构;掌握SQLite数据库的建立和操作方法;理解ContentProvider的用途和原理;掌握ContentProvider的创建与使用方法二:实验工具Eclipse( MyEclipse)+ ADT + Android2.2 SDK ;三:实验题目1. 应用程序一般允许用户自己定义配置信息,如界面背景颜色、字体大小和字体颜色等,尝试使用SharedPreferences保存用户的自定义配置信息,并在程序启动时自动加载这些自定义的配置信息。
2. 尝试把第1题的用户自己定义配置信息,以INI文件的形式保存在内部存储器上。
3. 使用代码建库的方式,创建名为test.db的数据库,并建立staff数据表,表内的属性值如下表所示:On ClickListe ner writeButt on Liste ner =new On ClickListe ner() {4. 建立一个ContentProvider ,用来共享第3题所建立的数据库; 四:实验代码 In ternalFileDemopublic class Intern alFileDemoexte nds Activity {private final Stri ng FILE_NAME = private TextView labelView privateTextViewdisplayView private CheckBox appendBox private EditText en tryText@Overridepublic voidon Create(Bu ndle saved In sta nceState) {super .onCreate(savedInstanceState); setContentView(yout.main );labelView =仃 extView)fi ndViewByld(R.id. label );displayView = (TextView)fi ndViewByld(R.id. display ); appendBox = (CheckBox)findViewByld(R.id. append ); en tryText= (EditText)fi ndViewByld(R.id.Button writeButton = (Butt on)fin dViewByld(R.id.Button readButton = (Butto n)fin dViewById(R.id.en tryText .selectAll();en tryText.fin dFocus();}"fileDemo.txt"entry );write );read );writeButton .setOnClickListener( writeButt on Liste ner ); readButton .setOnClickListener(readButt on Liste ner);@Overridepublic void onClick(View v) { FileOutputStream fos = null ; try {if ( appendBox .isChecked()){fos = openFileOutput( FILE_NAME ,Context. MODE_APPEND); } else {fos =openFileOutput( FILE_NAME ,Context. MODE_PRIVATE );}String text = entryText .getText().toString();fos.write(text.getBytes());labelView .setText( " 文件写入成功,写入长度:" +text.length());entryText .setText( "" );} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();finally {if (fos != null ){ try {fos.flush();fos.close();} catch (IOException e) { e.printStackTrace();}}}}};OnClickListener readButtonListener new OnClickListener() { @Overridepublic void onClick(View v) { displayView .setText( "" );FileInputStream fis = nulltry {fis = openFileInput( FILE_NAME );if (fis.available() == 0){return}byte [] readBytes = new byte [fis.available()];while (fis.read(readBytes) != -1){}Stri ng text = new Str in g(readBytes);displayView .setText(text);labelView .setText( "文件读取成功,文件长度:"+text.length());} catch (FileNotFoundException e) {e.pri ntStackTrace();}catch (IOExcepti on e) {e.pri ntStackTrace();}}};}SimplePrefere nceDemopublic class SimplePrefere nceDemo exte nds Activity {private EditText n ameText ;private EditText ageText ;private EditText heightTextJpublic static final Stri ng PREFERENCE_NAME = "SaveSetti ng"public static int MODE= Context.MODE WORLD READABLE +——Con text.MODE_WORLD_WRITEABLE;@Overridepublic void on Create(Bu ndle saved In sta nceState) {super .onCreate(savedInstanceState);setContentView(yout. main );nameText = (EditText)findViewByld(R.id. name );ageText = (EditText)findViewByld(R.id. age );heightText = (EditText)fi ndViewByld(R.id. height );}@Overridepublic void on Start(){super .onStart();l oadSharedPreferences();}private static final Stri ngDB_NAME = "people.db"privatestaticfinalStri ng DB_TABLE = "peopleinfo" privatestatic finalint DB_VERSION = 1J@Override public void on Stop(){ super .onStop(); saveSharedPrefere nces(); } private void loadSharedPrefere nces(){ SharedPrefere nces sharedPrefere nces = getSharedPrefere nces( PREFERENCE_NAME, MODE); Stri ng n ame = sharedPrefere nces.getStri ng( "Name"int age = sharedPreferences.getlnt( "Age" , 20); float height = sharedPrefere nces.getFloat( "Height"n ameText .setText (n ame); ageText .setText(Str ing. valueOf (age));heightText .setText(Stri ng. valueOf (height)); } private void saveSharedPrefere nces(){ SharedPrefere nces sharedPrefere nces = getSharedPrefere nces( PREFERENCE_NAME, MODE); SharedPrefere nces.Editor editor = sharedPrefere nces.edit(); "Tom");,1.81f);In teger. editor.putStri ng( "Name" , nameText .getText().toString()); editor.putI nt( "Age"parseInt ( ageText .getText().toString())); editor.putFloat( "Height" Float. parseFloat(heightText .getText().toString())); mit(); } SQLiteDemo DBAdapter.javapublic class DBAdapter {public static final String KEY_ID = "_id" ;public static final String KEY_NAME = "name" ;public static final String KEY_AGE = "age" ;public static final String KEY_HEIGHT = "height"private SQLiteDatabase db;private final Context context ;private DBOpenHelper dbOpenHelper ;public DBAdapter(Context _context) { context = _context;}/** Close the database */public void close() { if ( db !=null ){ db .close(); db = null ;}}/** Open the database */public void open() throws SQLiteException { dbOpenHelper = newDBOpenHelper( context , DB_NAME, DB_VERSION );null try {db = dbOpenHelper .getWritableDatabase();}catch (SQLiteException ex) {db = dbOpenHelper .getReadableDatabase();}}public long insert(People people) {ContentValues newValues = new ContentValues();newValues.put( KEY_NAME, people. Name );newValues.put( KEY_AGE , people. Age );newValues.put( KEY_HEIGHT , people. Height );return db .insert( DB_TABLE , null , newValues);}public People[] queryAllData() {Cursor results = db .query(KEY_NAME, KEY_AGE, KEY_HEIGHT },null , null , null , null , null ); return ConvertToPeople(results);}public People[] queryOneData( long id) {KEY_NAME, KEY_AGE, KEY_HEIGHT },return ConvertToPeople(results); }private People[] ConvertToPeople(Cursor cursor){int resultCounts = cursor.getCount();if (resultCounts == 0 || !cursor.moveToFirst()){return null ;}People[] peoples = new People[resultCounts];for ( int i = 0 ; i<resultCounts; i++){peoples[i] = new People();peoples[i]. ID = cursor.getInt(0);peoples[i]. Name =cursor.getString(cursor.getColumnIndex(peoples[i]. Age =cursor.getInt(cursor.getColumnIndex(peoples[i]. Height =cursor.getFloat(cursor.getColumnIndex(cursor.moveToNext();}return peoples;public long deleteAllData() {return}db .delete( DB TABLE , null , null );public long deleteOneData( long i d) {return db .delete( DB TABLE , KEY_ID + "=" + id, null }});DB_TABLE , new String[] { KEY_IDCursor results = db .query( DB_TABLE , new String[] { KEY_ID KEY_ID + "=" + id, null , null null , null );KEY_NAME));KEY_AGE ));KEY_HEIGHT ));public long update On eData(Conten tValues updateValues =long id , People people){new Conten tValues();updateValues.put( KEY_NAME, people. Name);updateValues.put( KEY_AGE, people. Age);updateValues.put( KEY_HEIGHT , people. Height );return db .update(null );DB_TABLE , updateValues, KEY_ID + "=" + id,/** 静态Helper类,用于建立、更新和打开数据库*/private static class DBOpe nH elper exte nds SQLiteOpe nH elper {public DBOpe nH elper(C on text con text, Stri ng n ame, CursorFactory factory, int versi on) {super (con text, n ame, factory, vers ion);}private static final String DB_CREATE = "create table "I!+ " float);"DB_TABLE + " (" + KEY_ID + "integer primary key autoincrement.KEY_NAME+ " text not null, " + KEY_AGE+ " integer," + KEY_HEIGHT@Overridepublic void on Create(SQLiteDatabase _db) {_db.execSQL(}DB_CREATE);@Overridepublic void on Upgrade(SQLiteDatabase_n ewVers ion) {_db.execSQL( onCreate(_db); "DROP TABLE IF EXISTS "_db, int _oldVers ion,+ DB_TABLE );int9People.javapublic class People {/** Called when the activity is first created. */privateDBAdapterdbAdepterprivate EditText n ameText private EditText ageText ; private EditText heightText privateEditTextidE ntry ;private TextView labelView private TextView displayView@Overridepublic void on Create(Bu ndle saved In sta nceState) { super .onCreate(savedInstanceState); setContentView(yout.main );n ameText = (EditText)fi ndViewById(R.id. ageText = (EditText)fi ndViewByld(R.id. heightText =(EditText)fi ndViewByld(R.id.idE ntry = (EditText)fi ndViewByld(R.id.public int ID = -1;publicStri ngName public int Age ;public floatHeight@Override publicStri ng toStri ng(){result += "ID :" + this ID + ",result += "姓名: "+ this .Name + result += "年龄: "+ this .Age + result += "身高: "+this.Heightretur n result;} }SQLiteDemo.javapublic class SQLiteDemo exte nds Activity { name); age );height ); id_entry ); Stri ng result =labelView = (TextView)findViewById(R.id. displayView = (TextView)findViewById(R.id.Button addButton = (Button)findViewById(R.id. Button queryAllButton = (Button)findViewById(R.id. Button clearButton = (Button)findViewById(R.id. Button deleteAllButton = (Button)findViewById(R.id. add );query_all clear );delete_allButton queryButton = (Button)findViewById(R.id. Button deleteButton = (Button)findViewById(R.id. Button updateButton = (Button)findViewById(R.id. query ); delete ); update );people. Name = nameText .getText().toString(); people. Age = label );display );addButton.setOnClickListener(queryAllButton.setOnClickListener( clearButton.setOnClickListener(deleteAllButton.setOnClickListener(queryButton.setOnClickListener(deleteButton.setOnClickListener(updateButton.setOnClickListener(dbAdepter = new DBAdapter(dbAdepter .open();}OnClickListener addButtonListener@Overridepublic void onClick(View v) {addButtonListener );queryAllButtonListenerclearButtonListener );deleteAllButtonListenerqueryButtonListener );deleteButtonListener )updateButtonListener )this );= new OnClickListener() {););People people = new People(); Integer. parseInt ( ageText .getText().toString());people. Height =( heightText .getText().toString()); Float. parseFloatlong colunm = dbAdepter .insert(people);if (colunm == -1 ){ labelView .setText( "添加过程错误!");} else {labelView .setText( " 成功添加数据,ID :" +String. valueOf (colunm));}}};OnClickListener queryAllButtonListener = new OnClickListener() { @Overridepublic void onClick(View v) {People[] peoples = dbAdepter .queryAllData();if (peoples == null ){labelView .setText( " 数据库中没有数据 " ); return ;}labelView .setText( " 数据库: " ); String msg = "" ; for ( int i = 0 ; i<peoples.length ; i++){msg += peoples[i].toString()+ "\n" ;}displayView .setText(msg);}};OnClickListener clearButtonListener = new OnClickListener() {@Overridepublic void onClick(View v) { displayView .setText( "" );}};OnClickListener queryButtonListener = new OnClickListener() { @Override public voidonClick(View v) {int id = Integer.parseInt ( idEntry .getText().toString());People[] peoples =dbAdepter .queryOneData(id);OnClickListenerdeleteAllButtonListener@Overridepublic voidonClick(View v) { dbAdepter.deleteAllData();String msg = " 数据全部删除 "labelView}.setText(msg);= new OnClickListener() {};if (peoples == null ){labelView .setText( " 数据库中没有ID 为" +String. valueOf的数据" );return ;}labelView .setText( " 数据库:" ); displayView .setText(peoples[0].toString());}};OnClickListener deleteButtonListener = new OnClickListener() {@Overridepublic void onClick(View v) {long id = Integer. parseInt ( idEntry .getText().toString()); long result =dbAdepter .deleteOneData(id);String msg = "删除ID 为“ +idEntry .getText().toString()++ (result>0? "成功":"失败");labelView .setText(msg);}};OnClickListener updateButtonListener = new OnClickListener() { @Overridepublic void onClick(View v) {People people = new People();people. Name = nameText .getText().toString();people. Age =Integer. parseInt ( ageText .getText().toString());people. Height=Float. parseFloat ( heightText .getText().toString());long id = Integer. parseInt ( idEntry .getText().toString());long count = dbAdepter .updateOneData(id, people);if (count == -1 ){labelView .setText( " 更新错误!" );} else {labelView .setText( " 更新成功,更新数据" +String. valueOf (count)+ " 条" );} }};}(id)+ " 的数据。
安卓系统Android应用程序开发PPT教材_第8章 数据存储与访问(23)
如果URI是单条数据,则返回的MIME数据类型应以 vnd.android.cursor.item开头 如果URI是多条数据,则返回的MIME数据类型应以 vnd.android.cursor.dir/开头
8.4 数据分享
8.4.2 创建数据提供者
继承ContentProvider,并重载六个函数
新建立的类继承ContentProvider后,Eclipse会提示程序 开发人员需要重载部分代码,并自动生成需要重载的代码 框架 下面的代码是Eclipse自动生成的代码框架
1. 2. • • • • • • • • •
import android.content.*; import android.database.Cursor; import .Uri; public class PeopleProvider extends ContentProvider{ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; }
8.4 数据分享
12. • • • • • • • • • • • • • • • • •
8.4.2 创建数据提供者
@Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; }
Android学习笔记---android数据存储与访问
Android学习笔记---android数据存储与访问数据存储与访问---------------------------------------一个在手机和sd卡上存储文件的例子 1.a.文件名称:lable n b.一个text框 n c.文件内容:label n d.一个text框 n e.保存:button -----------------------------/File/res/layout package com.credream.file; n n import com.credream.service.FileService; n n import android.app.Activity; n import android.os.Bundle; n import android.view.View; n import android.view.View.OnClickListener; n import android.widget.Button; n importandroid.widget.EditText; n import android.widget.Toast; n importandroid.widget.SimpleAdapter.ViewBinder; n n public class FileActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { n super.onCreate(savedInstanceState); setContentView(yout.main); Button button = (Button) this.findViewById(R.id.button); n button.setOnClickListener(new ButtonClickListener()); n } n private final class ButtonClickListener implementsView.OnClickListener { n n @Override public void onClick(View v) { EditTextn n filenameText = (EditText) findViewById(R.id.filename); EditTextn n contentText = (EditText) findViewById(R.id.filecontent); n String filename = filenameText.getText().toString(); String content = contentText.getText().toString(); n FileService service = new FileService(getApplicationContext ()); n // 这里也可以传FileActivity,因为FileActivity类,也是继承自 n // Context n try{ service.save(filename, content); n Toast.makeText(getApplicationContext(), R.string.success, 1) .show(); n } catch (Exception e) { Toast.makeText(getApplicationContext(), R.string.fail,1) .show n (); e.printStackTrace(); } n } n } } -----------------------------------------/File/src/com/credream/service/FileService.java package com.credream.service; n importjava.io.FileOutputStream; n import android.content.Context; n public class FileService { /** n*保存文件 n* @param filename 文件名称n* @param content n文件内容 n*/ private Context context; public FileService(Context context) { this.context = context; } public void save(String filename, String content) throws Exception { n//IO j2ee FileOutputStream outStream=context.openFileOutput n (filename,Context.MODE_PRIVATE); //mode:以覆盖形式和追加形式两种n n n n//context.openFileOutput (filename,mode) //Context.MODE_PRIVATE私有操作模式 创建出来的文件只能被本应用访问n ;其他应用无法访问该文件 //另外采用私有操作模式创建的文件,写入文件中的内容覆盖源文件的内容 outStream.write (content.getBytes());//content.getBytes()这个方法 n 调用系统的 //Returns a new byte array containing the characters of thisn n string encoded using the system's default charset.n n n nn //默认是用utf-8 //The behavior when this string cannot be represented in then n system'sdefault charset is unspecified. In practice, when the default charset isn n UTF-8 (as it is on Android), all strings can be encoded.n n n n n //没有默认编码的时候,会用iso8859-1来编码} } ----------------------------------------------------------------openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/”,如果文 n 件不存在,Android 会自动创建它。
Android学习笔记032之数据存储—文件存储读取
Android学习笔记032之数据存储—文件存储读取我们知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储、文件存储、SharedPreference存储、SQLite数据库存储、网络存储。
其中ContentProvider存储在我们介绍ContentProvider的时候已经介绍过了,现在我们学习其它的数据存储方式。
这一篇,我们介绍文件存储。
1、文件的操作模式我们在学Java的时候都知道,Java中的IO操作来进行文件的保存和读取,Android是基于Linux的,与Java不同的是Android在Context类中封装好了输入流和输出流的获取方法,分别是:FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。
Android 提供的文件模式有:MODE_PRIVATE:Android提供的默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
此外,Android还提供了其它几个重要的文件操作的方法:getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录File getFilesDir():获取app的data目录下的绝对路径String[] fileList():返回app的data目录下数的全部文件deleteFile(String fileName):删除app的data目录下的指定文件2、读写文件Android的读写文件和Java一样,也是一样通过IO操作实现,下面我们通过一个简单的例子走一下这个流程:布局文件代码:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/ed_file_save"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/btn_file_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="保存内容" /><Buttonandroid:id="@+id/btn_file_read"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="读取内容" /><TextViewandroid:id="@+id/tv_read_file"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:textColor="#000"android:textSize="14sp" /></LinearLayout>Activity代码:package com.example.datasave;import android.content.Context;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/*** Created by Devin on 2016/7/19.*/public class FileDataActivity extends AppCompatActivity {private EditText ed_file_save;private Button btn_file_save;private Button btn_file_read;private TextView tv_read_file;private String fileName = " hello.txt";@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_file);ed_file_save = (EditText) findViewById(R.id.ed_file_save);btn_file_save = (Button) findViewById(R.id.btn_file_save);btn_file_read = (Button) findViewById(R.id.btn_file_read);tv_read_file = (TextView) findViewById(_read_file);btn_file_save.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String fileContent = ed_file_save.getText().toString();try {save(fileContent);ToastUtils.showToast(FileDataActivity.this, "文件写入成功");} catch (Exception e) {e.printStackTrace();ToastUtils.showToast(FileDataActivity.this, "文件写入失败");}}});btn_file_read.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {try {String content = read();tv_read_file.setText("文件的内容是:" + content);} catch (IOException e) {e.printStackTrace();ToastUtils.showToast(FileDataActivity.this, "读取文件失败!");}}});}public void save(String fileContent) throws Exception {FileOutputStream output = this.openFileOutput(fileName, Context.MODE_PRIV ATE);output.write(fileContent.getBytes());output.close();}public String read() throws IOException {//打开文件输入流FileInputStream input = this.openFileInput(fileName);byte[] temp = new byte[1024];StringBuffer stringBuffer = new StringBuffer("");int len = 0;while ((len = input.read(temp)) > 0) {stringBuffer.append(new String(temp, 0, len));}//关闭输入流input.close();return stringBuffer.toString();}}最后是实现效果图:这里文件使用的模式是私有模式,只能本应用读取还会覆盖原文件,这样就可以实现简单的文件读写。
Android开发中的数据存储和访问方法详解(三)
Android开发中的数据存储和访问方法详解在Android应用开发中,数据存储和访问是一个非常重要的方向。
无论是开发一个国际知名的社交媒体应用,还是一个小巧实用的工具应用,都离不开对数据的存储和访问。
本文将围绕这一主题展开,分析Android开发中常见的数据存储和访问方法。
1. 内部存储内部存储是Android设备上每个应用的私有存储空间,只能被应用本身访问。
应用在内部存储中可以创建文件和目录,并进行读写操作。
这种存储方式适用于一些应用数据需要保密和不被其他应用访问的情况下。
常见的内部存储方法有使用Java的File和FileStream类,以及SharedPreferences类。
使用File和FileStream类可以方便地创建、读写和删除文件。
通过获取应用的内部存储目录,可以使用File类创建文件对象,然后通过FileStream类进行读写操作。
这种方法适用于需要对二进制文件进行读写的情况,比如保存应用设置、缓存文件等。
SharedPreferences类则适用于存储一些简单的键值对数据。
通过SharedPreferences类可以保存用户的偏好设置、记住用户名和密码等。
该类的使用非常简单,可以轻松实现数据的存储和访问。
2. 外部存储外部存储是指Android设备上的SD卡或其他外部存储设备,可以被多个应用共享访问。
外部存储可以用于存储一些较大的文件,比如音频、视频和图片等。
在访问外部存储时,需要校验设备是否存在外部存储设备,并且需要在Manifest文件中声明相应的权限。
使用外部存储时,可以通过Java的File和FileStream类来创建、读写和删除文件。
类似于内部存储,只是在创建文件时,需要将存储路径指定为外部存储路径。
使用外部存储需要注意空间的使用和设备兼容性,同时也要注意用户隐私和数据安全。
3. SQLite数据库如果应用需要存储大量结构化数据,如用户信息、应用日志等,那么使用SQLite数据库是一个很好的选择。
安卓系统Android应用程序开发PPT教材_第8章 数据存储与访问(10)
1. Resources resources = this.getResources(); 2. InputStream inputStream = null; • try { • inputStream = resources.openRawResource(R.raw.raw_file); • byte[] reader = new byte[inputStream.available()]; • while (inputStream.read(reader) != -1) { • } /forum-55-1.html 三星N7100 GALAXY Note2论坛
8.2 文件存储
8.2.3 资源文件
读取原始格式文件,首先需要调用getResource()函数 获得资源对象,然后通过调用资源对象的 openRawResource()函数,以二进制流的形式打开指定 的原始格式文件。在读取文件结束后,调用close()函数 关闭文件流 ResourceFileDemo示例中关于读取原始格式文件的核 心代码如下
8.2 displayView.setText(new String(reader,"utf-8")); 9. } catch (IOException e) { 10. Log.e("ResourceFileDemo", e.getMessage(), e); 11. } finally { 12. if (inputStream != null) { 13. try { 14. inputStream.close(); 15. } 16. catch (IOException e) { } 17. } 18. }
8.2 文件存储
第6章Android数据的存储与访问
第6章 数据存储与访问
6.1 简单存储
可读 (MODE_WORLD_READABLE) 可写(MODE_WORLD_WRITEABLE) 如果将SharedPreferences定义为私有模式,只有创建程 序有权对其进行读取或写入; 如果将SharedPreferences定义为可读模式,不仅创建程 序有权对其进行读取或写入,其他程序可以对其进行读 取,但不能写入; 如果将SharedPreferences定义为可写模式,不仅创建程 序有权对其进行读取或写入,其他程序可以对其进行写 入,但不能读取。 定义访问模式的方法如下所示:
Company Logo
第6章 数据存储与访问
6.2 文件存储
是否具备 SD 卡。 最后,SD卡中数据的存取通过 FileOutputStream/FileInputStream进行, SD卡不存 在读写限制。 下面通过修改LX6_1案例程序得到的LX6_2案例程序来了 解如何在SD卡中进行数据的读取。 (1)为手机模拟器设置SD卡,参照上面的操作设置步骤 (2)在LX6_2工程项目的AndroidManifest.xml文件中 加入访问SDCard的权限语句。 (3)设计res/layout目录下的main.xml布局文件,添加 两个按钮控件和两个编辑框控件 (4)编写LX6_2.java文件代码
Company Logo
第6章 数据存储与访问
6.2 文件存储
接下来,通过LX6_1的案例程序了解如何操作内部数据的 存取。 (1)设计res/layout目录下的main.xml布局文件,添加两 个按钮控件和两个编辑框控件。 (2)编写LX6_1.java文件代码。 (3)保存并运行程序,效果如图所示。
Android开发中的数据存储和访问方法详解(二)
一、引言在当今移动互联网时代,Android系统已经成为最重要的移动操作系统之一。
作为Android开发者,数据存储和访问是必不可少的技术领域。
本文将详细介绍Android开发中的数据存储和访问方法,帮助读者更好地理解和应用这些技术。
二、内部存储内部存储是指应用程序在设备上的私有存储空间。
在Android中,每个应用都有一个私有的内部存储空间,其他应用无法访问,确保了数据的安全性。
我们常用的方法有文件存储和SharedPreferences两种。
文件存储是将数据以文件的形式保存在设备上。
开发者可以通过Java的File和FileOutputStream来实现文件的读写操作。
当需要保存少量简单数据时,可以使用SharedPreferences,它是一种键值对的存储方式,非常方便快捷。
三、外部存储外部存储是指设备上的公共存储空间,可以被所有应用访问到。
Android系统提供了一些方法来操作外部存储,如读写SD卡上的文件。
外部存储的主要优点是容量大,但相对来说对数据的安全性和隐私保护较差。
在Android开发中,我们可以通过File类来操作外部存储。
首先需要获取外部存储的状态,确认是否有可用的外部存储空间,并声明文件的写入权限。
然后可以使用FileOutputStream来将数据写入外部存储。
四、数据库数据库是Android开发中常用的数据存储和访问方式。
Android系统内置了SQLite数据库,开发者可以通过SQLiteOpenHelper类来创建、打开和管理数据库。
SQLite是一种轻量级的数据库引擎,非常适用于移动设备。
在使用数据库之前,首先需要创建数据库表和定义数据结构。
通过创建一个继承自SQLiteOpenHelper的子类,可以实现数据库的创建和版本管理等功能。
然后可以使用SQLiteDatabase类来执行增删改查等操作。
通过使用SQLite数据库,开发者可以更高效地存储和管理大量结构化数据。
第七章_android_数据存储与访问
本章学习目标:
掌握SharedPreferences的使用方法 掌握各种文件存储的区别与适用情况 了解SQLite数据库的特点和体系结构 掌握SQLite数据库的建立和操作方法 理解ContentProvider的用途和原理 掌握ContentProvider的创建与使用方法
7.1 简单存储
7.1.1 SharedPreferences
SharedPreferences是一种轻量级的数据保存方式 通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在
Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的 操作过程 开发人员仅是通过调用SharedPreferences对NVP进行保存和读取
7.1 简单存储
7.1.1 SharedPreferences
SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数 据共享
SharedPreferences支持三种访问模式
私有(MODE_PRIVATE):仅有创建程序有权限对其进行 读取或写入
全局读(MODE_WORLD_READABLE):不仅创建程序 可以对其进行读取或写入,其他应用程序也读取操作的权限, 但没有写入操作的权限
全局写(MODE_WORLD_WRITEABLE):创建程序和其 他程序都可以对其进行写入操作,但没有读取的权限
7.1 简单存储
7.1.1 SharedPreferences
在使用SharedPreferences前,先定义SharedPreferences的访问模式 下面的代码将访问模式定义为私有模式 publicstatic有int 的MO时DE候= 需MO要DE将_PSRIhVaArTeEd; Preferences的访问模式设定为即可以全局读,也
安卓系统Android应用程序开发PPT教材_第8章 数据存储与访问(20)
8.3 数据库存储
8.3.4 数据操作
1. private People[] ConvertToPeople(Cursor cursor){ 2. int resultCounts = cursor.getCount(); 3. if (resultCounts == 0 || !cursor.moveToFirst()){ 4. return null; 5. } 6. People[] peoples = new People[resultCounts]; 7. for (int i = 0 ; i<resultCounts; i++){ 8. peoples[i] = new People(); 9. peoples[i].ID = cursor.getInt(0); 10. peoples[i].Name = cursor.getString(cursor.getColumnIndex(KEY_NAME)); 11. peoples[i].Age = cursor.getInt(cursor.getColumnIndex(KEY_AGE)); 12. peoples[i].Height = cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT)); 13. cursor.moveToNext(); 14. } 15. return peoples; 16. }
query()函数的参数说明
类型+名称 String table String[] columns String selection String[] selectionArgs String groupBy String having String orderBy 说明 表名称 返回的属性列名称 查询条件 如果在查询条件中使用的问号,则需要定 义替换符的具体内容 分组方式 定义组的过滤器 排序方式
Android开发中的数据存储和访问方法详解(一)
Android开发中的数据存储和访问方法详解Android应用程序的数据存储和访问是开发过程中必不可少的一个环节。
不同的数据存储方法适用于不同的场景和需求。
本文将对Android开发中的数据存储和访问方法进行详细的介绍和分析。
一、SharedPreferences方法SharedPreferences是一种轻量级的数据存储方式,适用于存储少量的简单配置数据,如应用程序的设置选项或用户的偏好设置。
SharedPreferences存储的数据以键值对的形式存在,可以跨越不同的Activity或Application进行访问。
SharedPreferences的使用非常简便,可以通过SharedPreferences类的getSharedPreferences方法获取SharedPreferences对象,并通过该对象的edit方法来添加、修改或删除数据。
二、SQLite数据库方法SQLite是Android中内置的关系型数据库,在Android开发中广泛应用于存储和访问结构化数据。
SQLite具有轻量级、高效性和可靠性的特点,适用于存储大量的数据或需要进行复杂的数据操作。
通过Android提供的SQLiteOpenHelper类,开发者可以创建和管理SQLite数据库。
SQLiteOpenHelper提供了创建和更新数据库的方法,并通过getWritableDatabase或getReadableDatabase方法获取数据库对象,用于进行数据的增删改查操作。
除了使用原生的SQL语句,Android还提供了一套方便的API,如query、insert、update和delete等方法,简化了开发者对数据库的操作。
三、文件存储方法除了使用SharedPreferences和SQLite数据库,Android还支持将数据存储到文件中。
文件存储适用于需要储存大量非结构化数据,如图片、音频和视频等。
Android提供了File和FileOutputStream等类,可以通过这些类来实现对文件的读写操作。
第八章_Android数据存储与访问
8.1 简单存储
8.1.2 示例
8. 9. public class SimplePreferenceDemo extends Activity { 10. 11. private EditText nameText; 12. private EditText ageText; 13. private EditText heightText; 14. public static final String PREFERENCE_NAME = "SaveSetting"; 15. public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE; 16. 17. @Override 18. public void onCreate(Bundle savedInstanceState) { 19. super.onCreate(savedInstanceState); 20. setContentView(yout.main); 21. nameText = (EditText)findViewById(); 22. ageText = (EditText)findViewById(R.id.age); 23. heightText = (EditText)findViewById(R.id.height); 24. }
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
8.1 简单存储
8.1.1 SharedPreferences
在获取到SharedPreferences对象后,则可以通过 SharedPreferences.Editor类对SharedPreferences进行 修改,最后调用commit()函数保存修改内容 SharedPreferences广泛支持各种基本数据类型,包括 整型、布尔型、浮点型和长型等等
安卓系统Android应用程序开发PPT教材_第8章 数据存储与访问(9)
程序开发人员可以将程序开发阶段已经准备好的原始格 式文件和XML文件分别存放在/res/raw和/res/xml目录下 ,供应用程序在运行时进行访问 原始格式文件可以是任何格式的文件,例如视频格式文 件、音频格式文件、图像文件和数据文件等等,在应用 程序编译和打包时,/res/raw目录下的所有文件都会保 留原有格式不变 /res/xml目录下的XML文件,一般用来保存格式化的数 据,在应用程序编译和打包时会将XML文件转换为高效 的二进制格式,应用程序运行时会以特殊的方式进行访 问
8.2 文件存储
8.2.2 外部存储
下面是SDcardFileDemo示例的核心代码
1. private static String randomNumbersString = ""; 2. OnClickListener writeButtonListener = new OnClickListener() { 3. @Override 4. public void onClick(View v) { • String fileName = "SdcardFile-"+System.currentTimeMillis()+".txt"; • File dir = new File("/sdcard/"); • if (dir.exists() && dir.canWrite()) { • File newFile = new File(dir.getAbsolutePath() + "/" + fileName); • FileOutputStream fos = null; • try { • newFile.createNewFile(); • if (newFile.exists() && newFile.canWrite()) { • fos = new FileOutputStream(newFile); • fos.write(randomNumbersString.getBytes());
Android开发中的数据存储和访问方法详解(九)
Android开发中的数据存储和访问方法详解随着智能手机的普及,Android系统已经成为全球最受欢迎的移动操作系统之一。
而在Android应用开发中,数据的存储和访问是一个至关重要的方面。
本文将深入探讨Android开发中常用的数据存储和访问方法,帮助开发者了解各种选择并合理应用它们。
一、Shared Preferences(共享首选项)Shared Preferences是Android提供的一种轻量级的数据存储方式,用于存储少量的键值对数据。
它适用于存储一些简单的配置信息或用户偏好。
Shared Preferences使用起来非常简单,只需要通过`getSharedPreferences()`方法获取SharedPreferences对象,然后可以通过`edit()`方法来编辑和保存数据。
值得注意的是,Shared Preferences只适合存储小型数据,对于大量或复杂的数据,推荐使用其他存储方式。
二、SQLite数据库SQLite是一个轻量级的嵌入式数据库引擎,可以在Android设备上进行数据存储和访问。
在Android应用开发中,SQLite广泛应用于数据的持久化存储。
通过SQLite数据库,开发者可以方便地创建表、插入数据、更新数据和进行查询操作。
为了使用SQLite数据库,需要创建一个继承自SQLiteOpenHelper的帮助类,并重写其中的`onCreate()`、`onUpgrade()`等方法。
SQLiteOpenHelper提供了创建和管理SQLite数据库的功能,可以通过`getReadableDatabase()`和`getWritableDatabase()`方法获取一个可读可写的数据库实例。
然后,可以使用SQL语句进行各种数据库操作,如创建表、插入数据、更新数据和查询数据等。
三、文件存储(Internal Storage和External Storage)除了数据库存储外,Android还提供了文件存储的方式。
Android开发中的数据存储和访问方法详解(七)
Android开发中的数据存储和访问方法详解在Android开发中,数据存储和访问是一个重要的主题。
无论是在开发应用程序还是在设计数据库,了解不同的数据存储和访问方法都是必要的。
本文将详细介绍Android开发中的几种常用的数据存储和访问方法。
一、Shared PreferencesShared Preferences 是Android中一种轻量级的存储方式,用于存储少量的键值对数据。
它通常用于存储一些简单的用户配置信息,比如用户首选项和设置。
通过使用SharedPreferences类的put()和get()方法,可以方便地读取和写入SharedPreferences中的数据。
这种存储方式简单、快速,但是不适合存储大量复杂的数据。
二、Internal StorageInternal Storage 是Android中的私有存储方式,每个应用程序都有自己独立的存储空间。
可以使用openFileOutput()和openFileInput()方法来创建和读取文件。
Internal Storage适合存储一些应用程序私有的数据,比如缓存文件。
但是需要注意的是,这种存储方式的文件只能被本应用程序访问,其他应用程序无法读取。
三、External StorageExternal Storage 是Android中的共享存储方式,可以被多个应用程序访问。
它可以是外部的SD卡,也可以是内部的存储空间,可以通过getExternalStorageDirectory()方法获取存储路径。
使用External Storage存储文件可以方便地与其他应用程序共享数据。
但是需要注意的是,使用External Storage需要在中声明相应的权限。
四、SQLite数据库SQLite是Android中内置的轻量级关系型数据库,广泛用于数据存储和访问。
通过使用SQLiteOpenHelper类,可以方便地创建和管理数据库。
SQLite具有结构化、跨平台、支持事务操作等优点,适合存储和查询大量复杂的数据。
09Android数据存储和访问(3)
第1次
1.新建项目
项目名称:MyDiary
包名:.bzu.db
类名:MainActivity
2.使用SQLiteHelper(抽象类)来完成数据库的创建
包:.bzu.service
进行单元测试:看数据库究竟有没有被创建出来
包:.bzu.db
类:DiaryServiceTest
配置好单元测试的环境
执行单元测试
创建好的数据库是以文件的形式进行存放的
存放位置:data/data/应用的包名/databases/diary.db
打开数据库:借助于第三方工具SQLiteDeveloper(注册数据库)导出数据库后,借助于第三方工具注册数据库
3.编写代码完成增删改查
首先定义实体类Diary
然后定义数据库访问类包:.bzu.service 类:DiaryService
JavaEE:面向接口编程,势必会建立很多类,虚拟机加载时是会消耗时间的。
完成添加日记的方法
思考,如果链接未关闭,调用database = dbOpenHelper.getWritableDatabase();仍然打开的是缓存中的数据库吗?
完成删除日记的方法
完成获取记录数的方法
4.。
数据存储与访问
CS&T Information Course
8.1 简单存储
8.1.1 SharedPreferences
SharedPreferences不仅能够保存数据,还能够实现不同应 用程序间的数据共享 SharedPreferences支持三种访问模式
私有(MODE_PRIVATE):仅有创建程序有权限对其进行读 取或写入 全局读(MODE_WORLD_READABLE):不仅创建程序可以 对其进行读取或写入,其他应用程序也读取操作的权限,但没 有写入操作的权限 全局写(MODE_WORLD_WRITEABLE):创建程序和其他 程序都可以对其进行写入操作,但没有读取的权限
CS&T Information Course
8.1 简单存储
8.1.2 示例
25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
@Override public void onStart(){ super.onStart(); loadSharedPreferences(); } @Override public void onStop(){ super.onStop(); saveSharedPreferences(); }
1. 2. 3. 4. 5. SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("Name", "Tom"); editor.putInt("Age", 20); editor.putFloat("Height", ); mit();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SharedPreferences:Activity之间的数据传递除了通过intent来传递外,还可以使用SharedPreferences来共享数据。
SharedPreferences是一种轻量级数据存储方式,能够实现不同应用程序间数据共享。
SharedPreferences使用键值对(Key-Value)的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下自己定义的xml文件中。
私有目录是:/data/data/应用程序包名/shared_prefs/SharedPreferences编程:(1)写入数据://获得SharedPreferences对象(如果不存在则新建)SharedPreferences sp = getSharedPreferences(名称,访问模式);//名称是:SharedPreferences数据保存的XML文件名//获得可编辑对象SharedPreferences.Editor editor = sp.edit();editor.putString(“Name”,”abc”); //p ut方法写数据(key-value)//一定要提交才能保存mit();(2)读取数据://获得SharedPreferences对象(如果不存在则新建) SharedPreferences sp = getSharedPreferences(名称, 访问模式); String name = sp.getString("Name", "DefaultVal"); //get方法读数据//第2个参数:在无法获取值的时候使用的缺省值SharedPreferences支持的三种访问模式:⏹MODE_PRIVATE (=0,私有):仅创建SharedPreferences的程序有权限对其进行读取或写入。
⏹MODE_WORLD_READABLE (=1,全局读):创建程序可以对其进行读取或写入,其它应用程序只具有读取操作的权限,但没有写入操作的权限。
⏹MODE_WORLD_WRITEABLE (=2,全局写):所有程序都可以对其进行写入操作,但没有读取操作的权限。
SQLite数据库:Android 在运行时(run-time)集成了SQLite,所以每个Android 应用程序都可以使用SQLite 数据库。
SQLite特点:⏹SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。
⏹普通数据库的管理系统比较庞大和复杂,会占用了较多的系统资源,轻量级数据库SQLite的特点:⏹比传统数据库更适合用于嵌入式系统⏹占用资源少,运行高效可靠,可移植性强⏹提供了零配置(zero-configuration)运行模式数据库存储在:/data/data/应用程序包名/databases/在Android中,某个应用程序创建的数据库只有它自己可以访问,其它应用程序是不能访问的。
创建数据库和表:⏹Android 提供了一个名为SQLiteOpenHelper的辅助类来管理数据库的创建和版本。
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。
⏹创建数据库辅助类:⏹当前项目src某包上->右键-> New -> class ->输入class名(例如DBOpenHelper),并继承SQLiteOpenHelper类,然后修改相关代码。
onCreate()://数据库第一次被创建时将调用onCreate()//通常将创建表的操作放在这里onUpgrade()://当数据库版本发生变化时会调用onUpgrade()//这里可写更新数据表的操作(谨慎使用),也可空着不写为辅助类添加构造函数和创建数据表代码:在SQLiteOpenHelper的子类当中,必须定义一个构造函数,该构造函数含四个参数:上下文对象、数据库名字、游标工厂和数据库版本号(值必须是整数并且是递增的状态,但不要设置为0, 如果为0则会每次都创建数据库)。
在Activity中使用辅助类来创建好打开数据库:在Activity类中定义1个成员(版本号)关于getWritableDatabase、getReadableDatabase:当用户调用getWritableDatabase或getReadableDatabase时:1、如果数据库不存在,就会调用onCreate(),不会调用onUpgrade();2、如果数据库存在,但是版本不一样,就调用onUpgrade(),不会调用onCreate();3、如果数据库存在,版本一样,不会调用onCreate()和onUpgrade(),此时如果数据库没有打开,就调用onOpen()方法打开,如果打开了就不调用onOpen().getWritableDatabase():打开一个可以读写的数据库getReadableDatabase():打开一个只读的数据库test.dbtest.db-journal 是数据库日志文件不使用辅助类来创建数据库和表的方法://打开或创建test.db数据库SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); //每个数据库都只能被创建它的包访问,所以不能将数据库设为WORLD_READABLE//CursorFactory一般设置为空db.execSQL("DROP TABLE IF EXISTS person");//创建person表db.execSQL("CREATE TABLE person (id INTEGER PRIMARY KEYAUTOINCREMENT, name VARCHAR, age SMALLINT)");SQLite编程1:1、SQLiteDatabase.execSQL():执行insert、delete、update和create table等有更改行为的SQL 语句2、SQLiteDatabase.rawQuery():执行select语句public void insert(Person person){DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);SQLiteDatabase db=helper.getWritableDatabase();db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)",new Object[ ] { , person.age } );db.close();Toast.makeText(getApplicationContext(), "记录添加成功", Toast.LENGTH_SHORT).show();}public void deleteById(int id){DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);SQLiteDatabase db=helper.getWritableDatabase();db.execSQL( "Delete from person where id=?", new Object[ ]{id} );db.close();Toast.makeText(getApplicationContext(), "记录删除成功", Toast.LENGTH_SHORT).show();public void deleteAll(){DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);SQLiteDatabase db=helper.getWritableDatabase();db.execSQL( "Delete from person", new Object[]{} );db.close();Toast.makeText(getApplicationContext(), "数据表全部清空", Toast.LENGTH_SHORT).show();}public void updateById(int id, Person person){DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);SQLiteDatabase db=helper.getWritableDatabase();db.execSQL("Update person set name=?, age=? where id=?", new Object[ ]{ ,person.age, id } );db.close();Toast.makeText(getApplicationContext(), "记录修改成功", Toast.LENGTH_SHORT).show();}查询数据:DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);SQLiteDatabase db=helper.getWritableDatabase();Cursor cursor = db.rawQuery( "SELECT * FROM person where age>?", new String[]{"10"} );//rawQuery()原生查询返回值是Cursor游标(结果集)TextView tv=(TextView)findViewById(R.id.textView1);tv.setText("查询到"+cursor.getCount()+"条记录(当前数据库版本号="+DB_VERSION+")");while (cursor.moveToNext()) {//根据列号取值int id = cursor.getInt(cursor.getColumnIndex("id") );String name = cursor.getString(cursor.getColumnIndex("name") );int age = cursor.getInt(cursor.getColumnIndex("age") );tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);}cursor.close(); //关闭cursordb.close();//关闭数据库连接Cursor游标的一些重要操作:Cursor.move(int offset); //以当前位置为参考,移动到指定行Cursor.moveToFirst(); //移动到第一行Cursor.moveToLast(); //移动到最后一行Cursor.moveToPosition(int position); //移动到指定行Cursor.moveToPrevious(); //移动到前一行Cursor.moveToNext(); //移动到下一行Cursor.isFirst(); //是否指向第一条Cursor.isLast(); //是否指向最后一条Cursor.isNull(int columnIndex); //指定列是否为空(列基数为0) Cursor.isClosed(); //游标是否已关闭Cursor.getCount(); //总数据项数Cursor.getPosition(); //返回当前游标所指向的行数Cursor.getColumnIndex(String columnName); //返回某列名对应的列索引值Cursor.getString(int columnIndex); //返回当前行指定列的值更新数据库(谨慎使用):Button bt6= (Button)findViewById(R.id.button6);bt6.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {DB_VERSION++;//更新test.db数据库,其中数据库新版本号=老版本+1 DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null,DB_VERSION);//触发DBOpenHelper类的onUpgrade方法SQLiteDatabase db=helper.getWritableDatabase();db.close();}});SQLite编程2:⏹SQLiteDatabase类自身提供了insert()、delete()、update()、query()四个方法对数据库进行操作;⏹这些方法封装了部分SQL语句,通过参数进行拼接。