Android学习——数据存储

android中数据存储的3种方式:
 SharedPreferences方式:它是 Android提供的用来存储一些简单配置信息的一种机制,采用了 XML 格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
 File文件存储方式: /data/data/包名/files 内存里面
/ context.openFileInput(name) 默认是私有的访问权限
 Sqlite数据库:
注意:sd卡不受权限控制
权限:写

1. 共享参数SharedPrefrences
SharedPrefrences是一个轻量级的存储,类一般存软件的配置信息,如游戏进度,屏幕亮度
文件存放位置:data/data/packagename/shared_prefs/
这里写图片描述
示例:

//写数据
//获得SharedPreferences对象,访问方式为私有
SharedPreferences sp = this.getSharedPreferences("shared.txt", Context.MODE_PRIVATE);
//获取编辑器
Editor editor = sp.edit();
//存入name,age
editor.putString("name", "xiaoming");
editor.putInt("age", 20);
//提交数据
editor.commit();

//读数据
//获得SharedPreferences对象,访问方式为私有
SharedPreferences sp2 = this.getSharedPreferences("shared.txt", Context.MODE_PRIVATE);
// 取出name,age的值
String name = sp2.getString("name", "");
int age = sp2.getInt("age", 0);
System.out.println("name="+name+"  age="+age);

因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件里追加内容,否则就创建新文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
但是,这两个权限不建议使用,如果别的程序要访问该程序中的内容建议使用内容提供者Content Provider。
说明:严格来说,MODE_APPEND追加不代表权限。
Android中有系统权限和文件权限
系统权限:10位 drwx rwx rwx
第一位为d 表示目录,l表示链接,- 表示文件
r w x 分别表示可读、可写、可执行的权限,第一组rwx表示当前用户的权限,第二组rwx表示和当前用户同组的其他用户的访问权限,第三组rwx表示其他组用户的访问权限,没有权限用 – 表示。
区别:获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
方式1获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
方式2获得的SharedPreferences对象只能在该Activity中使用.
2. 文件
示例:
新建一个测试类,完成文件的读写操作

public class FileTest extends AndroidTestCase {

    protected void setUp() throws Exception {
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }
    //android文件读写
    public void testWriteFile() {
        try {
            FileOutputStream out = this.getContext().openFileOutput("info.txt", Context.MODE_PRIVATE);
            out.write("hello你好".getBytes());
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void testReadFile() {
        try {
            FileInputStream in = this.getContext().openFileInput("info.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String str = null;
            while((str=reader.readLine())!=null){
                System.out.println(str);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

直接运行测试,会报错误如下:
AppDB does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml
必须在AndroidManifest.xml文件中添加配置:
这里写图片描述
这里写图片描述
最后生成的配置信息为:

<instrumentation android:targetPackage="com.example.appdb" android:name="android.test.InstrumentationTestRunner">
</instrumentation>
<uses-library android:name="android.test.runner"/>

先写后读,读出来后输出的结果为:
这里写图片描述
可以在其他应用程序中访问文件:
需要将info.txtde权限进行修改,改为其他用户可读可写:
FileOutputStream out = this.getContext().openFileOutput(“info.txt”, Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
另一个应用中访问:

        try {
            Context context = this.createPackageContext("com.example.appdb",
                    Context.CONTEXT_IGNORE_SECURITY);
            FileInputStream input = context.openFileInput("info.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String str = null;
            while((str = reader.readLine()) != null){
                System.out.println(str);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

3. SQLite3数据库
SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。
需要注意的一点是,SQLite只有NULL、INTEGER、REAL(浮点数)、TEXT(字符串)和BLOB(大数据)五种类型,不存在BOOLEAN和DATE类型。
3.1 简单访问SQLite数据库
简单示例:

//打开或创建数据库,已经存在就打开,不存在就创建
SQLiteDatabase db = this.openOrCreateDatabase("mydb", Context.MODE_PRIVATE, null);
//执行sql语句,创建users表
        db.execSQL("create table users(id integer primary key autoincrement,name varchar(10),age integer)");
//执行sql语句,插入3条记录
        db.execSQL("insert into users(name,age) values('aaa',20)");
        db.execSQL("insert into users(name,age) values('bbb',30)");
        db.execSQL("insert into users(name,age) values('ccc',45)");
//查询users表中数据,获得游标对象
        Cursor cursor = db.rawQuery("select * from users", null);
//通过移动游标cursor对象,打印每一列的值
        while (cursor.moveToNext()) {
            System.out.println(
                    cursor.getInt(cursor.getColumnIndex("id")) 
                    + "   " + cursor.getString(cursor.getColumnIndex("name"))
                            + "   " + cursor.getInt(cursor.getColumnIndex("age")));
        }

控制台下查看输出:
这里写图片描述
查看数据库文件所在位置:/data/data/com.example.appdb/databases/
这里写图片描述
其中com.example.appdb是程序的包名。
mydb是存放数据库的文件,mydb-Journal是数据库关联文件。
可以将mydb弄出来,用一个可视化的软件SQLite Expert Personal 3在图形界面下查看数据库文件:
这里写图片描述
条件查询:
Cursor cursor = db.rawQuery(“select * from users where name=? and age=?”,new String[]{“20”,”aaa”});
这里写图片描述
SQLite数据库访问的3种形式:
(1)程序:绝大多数要通过程序访问数据库
(2)图形界面:如上面的一个软件
(3)命令行:
命令行方式访问SQLite数据库:
(1)在cmd下输入adb shell(直接访问需配置path)
(2)进入sd卡目录cd /sdcard
(3)sqlite3 mydb.db 进入数据库,没有就创建
(4)常用语句:sql语句
.schema 查看表结构
.tables
.help
/或者分号代表sql语句结束
说明:
(1)在sqlite数据库中,自动增长的列,类型必须是integer,其他类型不行,int也不行;
(2)数据类型是弱类型,外连接中只支持左外连接
3.2 SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。

public class DBOpenHelper extends SQLiteOpenHelper{
    //因为父类SQLiteOpenHelper没有无参数的构造方法,所以,子类必须写有参数的构造方法
    public DBOpenHelper(Context context) {
        super(context, "newdb.db", null, 1);        
    }
    //此方法只执行一次,当创建数据库的时候执行,以后不再执行
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table users(id integer primary key autoincrement,name text,age integer)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

DBOpenHelper(Context context, String name, CursorFactory factory, int version)
其中name为数据库名,version为版本号
读的时候获得读数据库:
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
写的时候获得写数据库:
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值