3, Shared Preferences 存储配置信息(使用键值对) 4, 内容提供者(Content Providers)
5, 网络 将存储信息存储到服务器上,下次运行程序时可以读取,可以达到数据保存的效
果
SQLite:占用资源小,有
SQLite3
ODBC接口,跟Mysql、PostgreSQL相比处理速度快,现在已有
SQLite数据类型
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自 动判断。SQLite具有以下五种数据类型: 1, NULL:空值
2, INTEGER:带符号的整型,具体取决于存入数字的范围大小 3, REAL:浮点数字,存储为8—byte IEEE浮点数 4, TEXT:字符串文本
5, BLOB:二进制对象(图片,音频视频文件等) 实际上,SQLIte3也接受如下的数据类型: smallint integer 16位元的整数 32位元的整数 decimal(p,s) p精确值和s大小的十进位整数,精确值p是指全部由几个数(digits)大小值,s是指小数点后有几位数。如果没有特别规定,则系统会设为p=5,s=0 float double char(n) varchar(n) graphic(n) 32位元的实数 64位元的实数 n长度的字符串,n不能超过254 长度不固定且其最大长度为n的字串,n<=4000 和char(n)一样,不过其单位是两个字元double-bytes,n<=127。这个形态是为了支援两个字元长度的字体,例如中文字。 包含了年份、月份、日期 包含了小时、分钟、秒。 包含日期时间格式,必须写成2010-08-05,不能写成 2010-8-5 ,否则在读取时会产生错误 vargraphic(n) 可变长度且其最大长度为n的双元字串,n<=2000 date time Timestamp 包含了年、月、日、时、分、秒、千分之一秒。 Datetime
Demo
CREATE TABLE table { a VARCHAR(10), b VARCHAR(15), c TEXT, d INTEGER, e FLOAT f BOOLEAN g CLOB h BLOB I TIMESTAMP J NUMERIC(10,5) K VARYING CHARCTER(24) l NATIONAL VARYING CHARACTER(16) }
基本SQL命令
create insert update select delete order by group by having limit
通过DOS进入sqlite数据库:输入 sqlite3,退出输入 .exit 创建表:
create table t_student(sid INTEGER primary key autoincrement,sname varchar(20)); autoincrement 自增
insert into t_student(sid,sname) values (1,’coolszy’); select sid,sname from t_student;
update t_student set sname = ’laogao4’ where sid = 2; delete from t_student where sid = 2;
select sid,sname from t_student order by sid desc; 按sid从大到小排列 select sid sname from t_student limit 0,2; 0表示第一个元素,2表示选取长度
limit主要用于分页处理。
select count(id) from stu2; 得到表stu2中id的数目,一般用主键名 group by sname:即将数据库中的数据按sname从小到大排序,若有几个数据的sname相同,则只显示主键值最大的那个。
注:若主键是int型单没有自增标识时,第一次添加数据时若不指定主键值,则主键值会为空,后续的插入数据若也没有指定,则主键值一直为空;若第一次指定了主键值,则后续的
数据不指定主键值的话,主键值会根据当前数据库中最大的主键值+1作为新插入的数据的主键。
若主键是INTEGER型,则系统会默认第一个添加的为1.
若主键是自增的话,则系统会存储最大的主键值,即使删除掉最大主键的那条数据,再次添加数据(不指定主键值的话),系统会自动将最大的主键值+1赋给添加的数据。譬如目前的数据的主键值依次为1,2,10,删除掉主键=10的数据后,再次添加数据时,数据库中的数据的主键依次为1,2,11;
SQLiteOpenHelper类
方法解释:
public abstract void onCreate (SQLiteDatabase db)
Called when the database is created for the first time. This is where the creation of tables and the initial population of the tables should happen. 这里面通常放一些初始化表的初始化操作
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
Called when the database needs to be upgraded. The implementation should use this method to drop tables, add tables, or do anything else it needs to upgrade to the new schema version. The SQLite ALTER TABLE documentation can be found here. If you add new columns you can use ALTER TABLE to insert them into a live table. If you rename or remove columns you can use ALTER TABLE to rename the old table, then create the new table and then populate the new table with the contents of the old table.
升级数据库版本时,若表的结构发生变化,则可进行如下操作(设原表名为 STU): 1, 修改表名,如STU--TEMP_STU 2, 创建新表STU(结构修改后的) 3, 将TEMP_STU中的内容导入到STU中
4, 删除表TEMP_STU 注:也可先创建新表,导入数据后,再修改表名
以上两个方法是在继承该类时系统提示要覆盖的方法,另外系统会提示要添加一个构造方法,默认是4个参数的,但是可以只要一个参数就行,利用super调用父类的4个参数的构造方法,如:public DBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION); }
其中DBNAME是数据库名字,VERSION是数据库版本。
getReadableDatabase ():获取可读可写对象,当数据库满时(不能进行写操作时)获取一个只读对象
getWritableDatabase ():获取可读可写对象,当数据库满时(不能进行写操作时)会抛出异常
SQLiteDatabase类
方法解释:
void execSQL(String sql) Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data. 可执行create,delete等操作,select不能执行
void execSQL(String sql, Object[] bindArgs) Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE. 带占位符(?)的sql语句 CursorrawQuery(String sql, String[] selectionArgs) null
Runs the provided SQL and returns a Cursor over the result set. 带占位符的sql语句,,若没有占位符,则第二个参数用向最后一条记录的下方,即指向null
得到一个Cursor对象,指向第一条记录的上方,执行moveToNext()方法后,指向第一条记录,最终会指
数据插入: public long insert (String table, String nullColumnHack, ContentValues values) table:插入的表名
values:数据,以键值对形式存储,如:values.put(\"age\; nullColumnHack:当values参数为空或者里面没有内容时,插入会失败(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就将指定的列名的值设为null,然后再向数据库中插入
数据更新: public int update (String table, ContentValues values, String whereClause, String[] whereArgs) 参数依次为:表名,修改的值,条件,条件里的占位符的值(可为null)
数据查询: public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 有好几个方法,不一一列举
数据删除: public int delete (String table, String whereClause, String[] whereArgs)
数据库不推荐执行完一个方法就手动关闭,因为用户只有一个,而且手动关闭,如果下次需要操作数据库时会重新打开连接,会很麻烦,耗资源。 推荐当程序退出时再进行关闭。
数据存储到文件中
类Context的两个方法: 1, FileOutputStream openFileOutput(String name, int mode) name:文件的名称,不能包含分隔符’/’,如果文件不存在,Android会自动创建它。创建的文件保存在 /data/data/ Mode 如果文件中已经存在内容,则在内容末尾追加 MODE_PRIVATE 文件仅能被该程序访问,每次都进行覆盖 它们的共同点:文件仅能被当前应用程序访问 MODE_WORLD_READABLE :文件可被其它程序调用,可读 MODE_WROLD_WRITEABLE:可写 MODE_WORLD_READABLE+MODE_WROLD_WRITEABLE:可读可写 注:在model层将异常抛出,统一在activity中捕获。 保存数据到.xml文件中 涉及到的类: SharedPreferences 获取对象方法:Context类的 SharedPreferencesgetSharedPreferences(String name, int mode) name: 文件名,不用加后缀,系统会自动添加 .xml 后缀 mode: 同上 存储信息: 可通过 SharedPreferences 的内部类 Editor 来进行数据存储 获取 Editor 对象方法: 调用 SharedPreferences 对象的 edit() 方法即可 通过 Editor 对象的 put 方法将信息存储至文件中 注1:存储信息的结尾必须提交,通过调用 Editor 对象的 commit() 方法即可。 注2:若以前文件中已有相关信息,则再次存储时,信息会被覆盖(即使mode是MODE_APPEND)。 获取信息: 通过SharedPreferences 对象的 get 方法获得,如: abstract int getInt(String key, int defValue) key : 键值 defValue:若不存在该键值对应的信息,则取 delValue 这个默认值。 查看 xml 文件的方法: cat fileName.xml 因篇幅问题不能全部显示,请点此查看更多更全内容