当前位置:文档之家› 安卓学习之数据存储与访问

安卓学习之数据存储与访问

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语句,通过参数进行拼接。

相关主题