这两天在做安卓的实验,开发一个简单的具有增删改查功能的app。将所碰到的问题汇总下,以备遗忘。
1.SQLite的使用
1.1 打开或创建数据库
SQLiteDatabase db = openOrCreateDatabase("demo.db", Context.MODE_PRIVATE, null);
MODE_PRIVATE为默认操作模式,代表该文件是私有数据,只能被应用本身访问,而且写入的内容会覆盖原文件的内容。相应的有MODE_APPEND(检查文件是否存在,存在就往文件追加内容,否则就创建新文件)、WORLD_READABLE(表示当前文件可以被其他应用读取)、WORLD_WRITEABLE(表示当前文件可以被其他应用写入)。
第二种方式:
SQLiteDatabase db = openDatabase("demo.db", null, SQLiteDatabase.OPEN_READWRITE, null);
第二个参数为factory工厂模式,第三个参数为数据库的打开模式,上面是可读可写,相应的还有OPEN_READONLY(只读方式)、CREATE_IF_NECESSARY(不存在数据库时创建数据库)。
1.2 建表以及增、删、改、查数据库
建表:
db.execSQL("Create table if not exists UserTb(uid integer primary key autoincrement, uname String)");
上述语句是创建一个UseTb的表,包含uid(integer类型)与uname(String)两列。uid为主键,autoincrement为自动编号,默认从1开始,每条新记录增加1。
数据库插入语句(增):
db.execSQL("Insert into UserTb(uname) values (?)", new Object[]{username});
上述语句是向UserTb表中的uname列插入变量username的值。
数据库删除语句:
db.execSQL("Delete from UserTb where uname='"+username+"'");
上述语句是删除UserTb表中的包含uname列username变量值的记录。(
注意where子句的等号后面有单引号,不然会
SQLiteLog (1) no such Column
报错)
数据库更新语句(改):
db.execSQL("Update UserTb set uname='" + username + "' where uid=1");
上述语句是更新UserTb表中uid为1的uname,值改为变量username的值。
数据库查询语句:
Cursor cr = db.query("UserTb",null,"uid<?",new String[]{String.valueOf(100)},null,null,null);
查询需要用到Cursor(游标),普通的execSQL()用于查询语句将返回void,使用Cursor将返回一个游标数组,然后操作游标来进行取值。
cr.moveToPosition(i); //移动到i位置,boolean类型
cr.moveToFirst(); //移动到第一条记录
cr2.getCount(); //游标结果集的总记录条数
cr2.getInt(int columnIndex); //根据列索引获得int类型值
cr2.getString(int columnIndex); //根据列索引获取String类型值
模糊查询:
Cursor cr = mdb.rawQuery("Select * from MovieTb where moviename like '%"+movie_name+"%'",null);然后操作游标取值,在此不做赘述。
2. 报错提醒
2.1 CursorIndexOutOfBoundsException: Index <?> requested, with a size of <?>
字面意思即游标索引越界,什么原因呢,很多时候是由于你Cursor结果集操作的时候没有moveToPosition()等移动游标位置,根据情况使用moveToNext()等方法操作游标即可。
2.2 SQLiteLog(1) no such Column:<?>
这种错误是由于没有找到这个列,很多时候是忘了加单引号"'"。
3 一些小问题
3.1 设置android软键盘默认不弹出
第一种 AndroidManifest.xml文件在相应Activity设置如下:
activity android:windowSoftInputMode = "stateAlwaysHidden | adjustPan"
stateAlwaysHidden是表示默认在该Activity中隐藏不弹出,adjustPan是Activity的主窗口不会调整屏幕的大小而留出软键盘的空间。
第二种 java代码的OnCreate()中插入代码:
getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
3.2 设置android中EditText文本不居中
使用android:gravity属性进行设置,例如:
android:gravity="top|left" //表示左上角显示