1.文件
    1)保存到手要内存,文件保存到/data/data对应的应用程序包下面
    如    FILE_PATH = "/data/data/com.diysoul.filedemo/info.dat"
    可通过Context的方法取得包名对应的文件夹来保存文件 /data/data/包名/files/
    File fileDir = getFilesDir();
    /data/data/包名/cache/
    getCacheDir();
    再加入文件名来保存文件
    File filePath = new File(fileDir, "info.dat");
    存储
       FileOutputStream fos = new FileOutputStream(FILE_PATH);
       fos.write(stringInput.getBytes());
       fos.flush();
       fos.close();
    读取
       FileInputStream fis = new FileInputStream(FILE_PATH);
       BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
       String strInfo = reader.readLine();

2)保存到SD卡
    存储和读取SD卡中的数据需要配置权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    首先取得SD卡的状态
    String state = Environment.getExternalStorageState();
    if(!Environment.MEDIA_MOUNTED.equals(state))
    {
        return "";
    } 
    取得SD卡的位置
    File fileSDCard = Environment.getExternalStorageDirectory();
    创建文件
    File file = new File(fileSDCard, FILE_NAME); 
    存储
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(stringInput.getBytes());
    fos.flush();
    fos.close();
    读取
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));     
    reader.readLine();

3).使用Context的方法保存文件
    相关方法在 /data/data/包名/files/ 下创建文件
    FileOutputStream fos = context.openFileOutput(FILE_NAME, mode);
    FileInputStream fis = context.openFileInput(FILE_NAME);
    FILE_NAME用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android会自动创建它。创建的文件保
    存在/data/data/<package name>/files目录
    mode指定用于指定操作模式,   
    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖
    原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
    Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
    MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
    MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
    如果希望文件被其他应用读和写,可以传入:
    openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

注意:1).模拟器如果未指定SD卡的大小,则state将返回removed,表示没有SD卡!
               2).android文件权限在DDMS中可以看到
    android文件权限
    - --- --- ---
    第1位:d为文件夹,-为普通文件,l为挂载某一个文件
    第2-4位:代表当前用户的权限,如 rw- = 110 = 6
    第5-7位:代表当前用户所在组的其它组员的权限
    第8-10位:代表所有的权限
    ---没有任何权限,r--可读,-w-可写,rw-可读可写,--x可执行

2.使用SharedPreferences对象
    创建文件时默认会添加后缀名xml
    存储
    // 文件保存在 /data/data/包名/shared_prefs/
    SharedPreferences sharePreference = context.getSharedPreferences(
    FILE_NAME, Context.MODE_APPEND);
    // 取得Editor对象
    Editor editor = sharePreference.edit();
    // 写入数据
    editor.putString(INFO, stringInput);
    // 提交,保存到物理磁盘
    editor.commit();
    读取
    // 文件保存在 /data/data/包名/shared_prefs/
    SharedPreferences sharePreference = context.getSharedPreferences(FILE_NAME, Context.MODE_APPEND);
    // 读数据
    String result = sharePreference.getString(INFO, ""); 
    权限同上

3.数据库SQLite3
    1).通过继承SQLiteOpenHelper类开发子类,使用getReadableDatabase和getWritableDatabase方法取得数据库对象,操作数据库。开发者需要做的只是重写两个方法即可。

  

 package com.diysoul.sqlitedemo.db;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; /**
* @author John 数据库帮助类,用于创建和管理数据库
*/
public class MySqliteHelper extends SQLiteOpenHelper { /**
* 数据库文件名称
*/
private static String stringName = "Person.db"; /**
* 数据库版本号,不能小于1
*/
private static int version = 1; /**
* @param context
* 上下文
* @param name
* 数据库文件名
* @param factory
* 游标工厂
* @param version
* 版本号
*/
public MySqliteHelper(Context context) {
super(context, stringName, null, version);
} /**
* 数据库创建时的回调方法,初始化表
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 操作数据库
//1.创建表
String sql = "create table person(_id integer primary key autoincrement, name varchar(20), age interger);";
db.execSQL(sql);
//AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table person(id interger primary key autoincrement, name varchar(20), age interger); } /**
* 数据库版本号更新时回调此方法,更新数据库的内容,包括增加表,删除表,或修改表
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
} }

  对于sql语句,在java代码中无法检查出错误,可以在PC端数据库软件SQLite Expert Personal 3(百度盘有备份)中运行,确认没有问题再添加到代码中,将需要动态传入的参数用‘?’代替,加入参数即可。
    // 1.创建表
    create table person(_id integer primary key autoincrement, name varchar(20), age interger);
    // 2.插入数据
    insert into person(name, age) values('lsi', 24);
    insert into person(name, age) values('王二', 24);
    db.execSQL("insert into person(name, age) values(?, ?);",
        new Object[] { person.getName(), person.getAge() });
    // 3.删除数据
    delete from person where _id = 2;
    db.execSQL("delete from person where _id = ?;", new Object[] { id });
    // 4.更新数据
    update person set name = 'tt' where name = '王二'
    update person set name = 'zhangshan' where name = 'tt'
    db.execSQL("update person set name = ?, age = ? where _id = ?;",
            new Object[] { person.getName(), person.getAge(),
         person.getId() });
    // 5.查询数据
    select * from person;
    select * from person where _id > 2;
    Cursor cursor = db.rawQuery("select _id, name, age from person;", null);
    Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;",
         new String[] { String.valueOf(id) });
    通过cursor读出需要的数据
        if (cursor != null && cursor.getCount() > 0) {
            int id;
            String name;
            int age;
            while (cursor.moveToNext()) {
                id = cursor.getInt(0);// 第0列 对应 _id
                name = cursor.getString(1); // 第1列 对应 name
                age = cursor.getInt(2); // 第2列 对应 age
                list.add(new Person(id, name, age));
            }
     }
     //查询一条语句
     if (cursor != null && cursor.moveToFirst()) {
            id = cursor.getInt(0); // 对应 _id
            String name = cursor.getString(1); // 对应 name
            int age = cursor.getInt(2); // 对应 age
            person = new Person(id, name, age);
        }
    db对象:
    MySqliteHelper mySqlHelper;
    SQLiteDatabase db = mySqlHelper.getWritableDatabase();
    //注意,每一次操作之后都需要关闭数据库
    db.close();

Android数据存储与访问的更多相关文章

  1. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  2. 10、Android数据存储

    课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...

  3. Android - 数据存储 -存储文件

    Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...

  4. Android - 数据存储 -存储键值对

    如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ...

  5. 数据存储与访问之——初见SQLite数据库

          本节引言: 本节学习Android数据库存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同,我们并不需要在手机上另外安装一个数据库手机软件,Android系统已经集成了这 ...

  6. Android数据存储:SDCard

    Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...

  7. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  8. 【Android开发日记】之入门篇(八)——Android数据存储(下)

    废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...

  9. Android数据存储之SQLite数据库

    Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...

随机推荐

  1. (转)Shadow Mapping

    原文:丢失,十分抱歉,这篇是在笔记上发现的.SmaEngine 阴影和级联部分是模仿UE的结构设计   This tutorial will cover how to implement shadow ...

  2. java poi技术读取到数据库

    https://www.cnblogs.com/hongten/p/java_poi_excel.html java的poi技术读取Excel数据到MySQL 这篇blog是介绍java中的poi技术 ...

  3. 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约

    以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...

  4. SIG蓝牙mesh笔记5_Provisionging

    目录 Bluetooth Mesh Provisioning Provisioning bearer layer Generic Provisioning PDU Bluetooth Mesh Pro ...

  5. Linux查看物理CPU个数,核数,逻辑CPU个数;内存信息

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  6. 如何理解*p++

    后置递增运算符的优先级高于解引用运算符! *p++ 等价于 *(p++) 但是,我们*p++的求值结果不可理解为p+1指向的对象的值,而应该是p指向的对象的值. 这是由于后置++的特性引起的. *p+ ...

  7. 王者荣耀交流协会beta冲刺贡献分分配结果

    根据原来约定的(贡献分分配规则){http://www.cnblogs.com/gaoyb348/p/7828523.html} 总共20个任务,一共35分,那么一个任务1.75分. 冉华完成了9个任 ...

  8. 软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

    一.升级要求:让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 二.设计思想: 1.首先输入答案并判断对错.我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案.每输出一道 ...

  9. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  10. JDK源码分析 – LinkedList

    LinkedList类的申明 public class LinkedList<E> extends AbstractSequentialList<E> implements L ...