对于java–Android–如何用表创建Sqlite数据库感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解用java实现sql创建数据表,并且为您提供关于AndroidSQLite数据库已
对于java – Android – 如何用表创建Sqlite数据库感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解用java实现sql创建数据表,并且为您提供关于Android SQLite数据库已损坏、android SQLite数据库总结、Android Sqlite数据库架构、Android Sqlite数据库详解的宝贵知识。
本文目录一览:- java – Android – 如何用表创建Sqlite数据库(用java实现sql创建数据表)
- Android SQLite数据库已损坏
- android SQLite数据库总结
- Android Sqlite数据库架构
- Android Sqlite数据库详解
java – Android – 如何用表创建Sqlite数据库(用java实现sql创建数据表)
参见英文答案 > When is SQLiteOpenHelper onCreate() / onUpgrade() run? 14个
我需要创建一个包含3个表的数据库,我这样做如下:
public class DatabaseUtils extends sqliteOpenHelper {
private final Context myContext;
private sqliteDatabase DataBase;
// Database creation sql statement
private static final String CREATE_TABLE_CS = "create table "+ TABLE_CS + "(" + COLUMN_CS + " TEXT NOT NULL, " + COLUMN_CE_CID + " INTEGER NOT NULL, "+ COLUMN_CE_PID +" INTEGER NOT NULL);";
private static final String CREATE_TABLE_SS = "create table "+ TABLE_SS + "(" + COLUMN_SS + " TEXT NOT NULL, " + COLUMN_SUB_CID + " INTEGER NOT NULL, "+ COLUMN_SUB_PID +" INTEGER NOT NULL);";
private static final String CREATE_TABLE_AS = "create table "+ TABLE_AS + "(" + COLUMN_AS + " TEXT NOT NULL, " + COLUMN_CID + " INTEGER NOT NULL, "+ COLUMN_AID +" INTEGER NOT NULL);";
public DatabaseUtils(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DATABASE_PATH = Environment.getDataDirectory().getAbsolutePath() + "/" +"data/"+ context.getResources().getString(R.string.app_package);
this.myContext = context;
}
@Override
public void onCreate(sqliteDatabase database) {
database.execsql(CREATE_TABLE_CS);
database.execsql(CREATE_TABLE_SS);
database.execsql(CREATE_TABLE_AS);
}
@Override
public void onUpgrade(sqliteDatabase db, int oldVersion, int newVersion) {
Log.w(DatabaseUtils.class.getName(),"Upgrading database from version " + oldVersion + " to "+ newVersion + ", which will destroy all old data");
//db.execsql("DROP TABLE IF EXISTS " + TABLE_COMMENTS);
onCreate(db);
}
}
在我的Activity中,我在onCreate中调用DatabaseUtils类,如下所示:
DatabaseUtils db = new DatabaseUtils(this);
但数据库不是用3个表创建的.我究竟做错了什么?顺便说一句,我正确地拥有所有字符串值.请帮我看看如何创建数据库.
解决方法:
我找到了解决方案.如果我实现如下所示,则永远不会调用DatabaseUtils的onCreate():
DatabaseUtils db = new DatabaseUtils(this);
在myActivity的onCreate()方法中.我需要在myActivity中调用getWritableDatabase(),如下所示:
DatabaseUtils db = new DatabaseUtils(this);
db.getWritableDatabase();
然后将调用DatabaseUtils的onCreate()并创建表.
Android SQLite数据库已损坏
现在大约有300人使用我的Android应用程序,每次使用此堆栈跟踪向服务器发送崩溃报告时:
android.database.sqlite.sqliteDatabaseCorruptException: database disk image is malformed at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2596) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621) at android.app.ActivityThread.access$2200(ActivityThread.java:126) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4595) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.sqlite.sqliteDatabaseCorruptException: database disk image is malformed at android.database.sqlite.sqliteQuery.native_fill_window(Native Method) at android.database.sqlite.sqliteQuery.fillWindow(sqliteQuery.java:75) at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:295) at android.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:276) at android.database.AbstractCursor.movetoPosition(AbstractCursor.java:171) at android.database.AbstractCursor.movetoFirst(AbstractCursor.java:248)
结果是应用程序崩溃并且数据库中的所有数据都丢失了.
需要注意的一点是,每次我读取或写入数据库时,我都会得到一个新的sqliteDatabase,并在完成后立即将其关闭.我这样做是为了防止这种腐败错误.
我还尝试使用单个静态对象同步所有数据库读取和写入,这似乎没有帮助.
这可能只是一个sqlite错误吗?
我在这里找到了与内置电子邮件应用程序类似的错误:http://code.google.com/p/android/issues/detail?id=5610.
这是我的代码:
public class keyvalueTableAdapter extends BaseTableAdapter { private String tableName; private String keyColumnName; private String valueColumnName; public keyvalueTableAdapter(Context context,String tableName,String keyColumnName,String valueColumnName) { super(context); this.tableName = tableName; this.keyColumnName = keyColumnName; this.valueColumnName = valueColumnName; } protected String getStringValue(int key) { Cursor cursor = null; sqliteDatabase db = null; String value; try { db = dbOpenHelper.getReadableDatabase(); cursor = db.query(true,tableName,new String[] { valueColumnName },keyColumnName + "=" + key,null,null); if ((cursor.getCount() == 0) || !cursor.movetoFirst()) { value = null; } else { value = cursor.getString(0); } } finally { if (cursor != null) cursor.close(); if (db != null) db.close(); dbOpenHelper.close(); } return value; } } public abstract class BaseTableAdapter { protected DbOpenHelper dbOpenHelper; public BaseTableAdapter(Context context) { this.dbOpenHelper = new DbOpenHelper(context,DatabaseSettings.DATABASE_NAME,DatabaseSettings.DATABASE_VERSION); } }
解决方法
“the DB holds session information so
it’s not very feasible to do a backup.
The data changes by the minute”
您应该尝试使用SharedPreferences:它存储键值对(在后台,它使用文件).
存储值:
SharedPreferences sp=MyActivity.getSharedPreferences("Name",Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("key",value); editor.putBoolean("another",true); editor.commit();
检索数据:
sp.getString("key","Not found"); // "Not found" is the default value // if sp does not contain the specified key sp.getBoolean("another",false); // false is the default value // if sp does not contain the specified key
有关更详细的说明,请参见getSharedPreferences和SharedPreferences.
android SQLite数据库总结
sqlite
sqlite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准sql语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用。
sql语法就不介绍了,直接看在android中的使用
sqliteOpenHelper――封装好的数据库操作辅助类,需重写
重写方法
onCreate:初始化数据库,创建表,添加初始数据
onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等
常用方法
getReadableDatabase() 获取sqliteDatabase对象,操作数据库
getWritableDatabase() 获取sqliteDatabase对象,操作数据库
区别:在磁盘空间满或不可写时,1方法将获得只读的数据库对象,而2方法会报错,在正常情况下,获取到的都是可读写的数据库对象。
import android.content.Context; import android.database.sqlite.sqliteDatabase; import android.database.sqlite.sqliteOpenHelper; public class DBHelper extends sqliteOpenHelper { private static final String name="my";//数据库名 private static final int version=1;//版本号 //重写构造方法的时候选择参数少的一项 public DBHelper(Context context) { //1:上下文 2:数据库名称 3:游标创建工厂 4:数据库版本 版本只能是整数 1 2 3.. super(context,name,null,version); } //数据库的初始化 sqliteDatabase数据库操作对象 //一般只在第一次运行和版本更新的时候调用 @Override public void onCreate(sqliteDatabase db) { //创建数据库 主键默认自增 db.execsql("create table student(" + "_id integer not null primary key autoincrement," + "name varchar(20)," + "phone varchar(11)," + "gender varchar(2))"); //添加一条测试数据 db.execsql("insert into student values(null,?,?)",new Object[]{"小黑","12345678901","男"}); } /** * 在版本升级的时候调用 * 修改version 为2 表示版本升级 就会调用这个方法 * @param db 数据库操作对象 * @param oldVersion 旧版本号 * @param newVersion 新版本号 */ @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { } }
在android数据库的创建是需要创建对象才能创建的
在activity类中创建出一个数据库类对象
创建好数据对象就可以操作数据了 通过sqliteDatabase获取 两种获取方法的区别上面已经提到过了
//创建数据 DBHelper helper =new DBHelper(this); //调用数据操作对象 sqliteDatabase dbWrite=helper.getWritableDatabase(); sqliteDatabase dbRead=helper.getReadableDatabase();
sqliteDatabase给我们提供了很多操作数据的方法
删除:(int) delete(String table,String whereClause,String[] whereArgs)
table: 表名
whereClause:where条件 列名 占位符 id=?
whereArgs:参数值数组
添加:(long) insert(String table,String nullColumnHack,ContentValues values)
nullColumnHack:为空列
ContentValues values:通过键值对存储添加的数据 key为列 value为值
insert方法 底层是通过拼接字符串的方式 如果ContentValues是空的 拼接成的sql语句无法执行会报错 所以给一个可以为空的列当ContentValues为空时也可以执行 有兴趣的可以看一下源码
更新:(int) update(String table,ContentValues values,String[] whereArgs)
参数意思同上
查询:(Cursor) query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
返回值是一个游标 这个query参数较多 简单的查询就还是写一条sql语句简单点
boolean distinct 去重复
String table 表名
String[] columns要查询的列
String selection查询条件
String[] selectionArgs查询参数值
String groupBy分组
String having分组条件
String orderBy排序
String limit分页查询限制
关闭数据库:(void) close()
执行一条sql语句:(void) execsql(String sql) 增删改查
查询查询sql:(Cursor) rawQuery(String sql,String[] selectionArgs)
事务
try { db.beginTransaction();//开启事务 // db.update(); // db.insert(); db.setTransactionSuccessful(); //没有设置事物成功 finally就会回滚 } catch (Exception e) { e.printstacktrace(); }finally { db.endTransaction(); }
贴代码咯 执行sql语句 和封装好的方法
查询
private void query() { StringBuffer sb=new StringBuffer("select * from student where 1=1"); //参数集合 List<String> params=new ArrayList<>(); if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); } if(!TextUtils.isEmpty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append(" and name=?"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append(" and gender=?"); params.add(gender); } sqliteDatabase db=helper.getReadableDatabase(); String [] projection=new String [params.size()]; params.toArray(projection); //返回值 游标 Cursor cursor=db.rawQuery(sb.toString(),projection); //判断游标是否为空,是否有一个值 while(cursor!=null&&cursor.movetoNext()){ // getColumnIndex获取列的下标 cursor.getXXXX()获取指定列的值 String name=cursor.getString(cursor.getColumnIndex("name")); Integer id=cursor.getInt(cursor.getColumnIndex("_id")); } }
用不到的参数就让它为空吧 遍历数据就while循环就好咯
Cursor c = db.query("student",null);//查询并获得游标
更新
private void update() { StringBuffer sb=new StringBuffer("update student set "); List params=new ArrayList(); if(!TextUtils.isEmpty(phone)){ sb.append("phone=?,"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append("name=?,"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append("gender=?,"); params.add(gender); } if (params.size()!=0){ //更新操作拼接字符串末尾有一个","需要去除 //删除最后一位的“,” sb.setLength(sb.length()-1); sb.append(" where 1=1"); //通过id指定 更新那行数据 if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); }else{ Toast.makeText(this,"请填写id",Toast.LENGTH_SHORT).show(); return; } sqliteDatabase db=helper.getWritableDatabase(); Object [] o=new Object[params.size()]; params.toArray(o);//将数据存放到指定的数组中 db.execsql(sb.toString(),o); } }
ContentValues cv = new ContentValues();//实例化ContentValues cv.put("name","123");//添加要更改的字段及内容 String whereClause = "phone=?";//修改条件 String[] whereArgs = {"12312313213"};//修改条件的参数 db.update("student",cv,whereClause,whereArgs);//执行修改
删除
private void delete() { getAllText(); //拼接sql语句 StringBuffer sb=new StringBuffer("delete from student where 1=1"); //保存参数的list List params=new ArrayList(); //判断条件 动态拼接 if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); } if(!TextUtils.isEmpty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append(" and name=?"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append(" and gender=?"); params.add(gender); } sqliteDatabase db=helper.getWritableDatabase(); if (params.size()!=0){ Object [] o=new Object[params.size()]; params.toArray(o);//将数据存放到指定的数组中 //执行删除 db.execsql(sb.toString(),o); }else{ db.execsql(sb.toString()); } Toast.makeText(this,"删除完成",Toast.LENGTH_SHORT).show(); }
String whereClause = "name=?";//删除的条件 String[] whereArgs = {"123"};//删除的条件参数 db.delete("student",whereArgs);//执行删除
增加
private void insert() {//保存数据到object数组 Object [] o=new Object[]{name,phone,gender}; //获取数据库操作对象 sqliteDatabase db=helper.getWritableDatabase(); //sql:sql语句 bingArgs:参数数组 db.execsql("insert into student values(null,o); //关闭连接 db.close(); Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show(); }
ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据 cv.put("name","123"); db.insert("student",cv);//执行插入操作
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!
Android Sqlite数据库架构
我想我已经用android创建了一个sqllite数据库,但每次我去做一个插入它声称一个列不存在.如何查看模式,是在对象创建时调用的onCreate方法?
解决方法:
你可以用代码来做. sqlite有一个名为“sqlite_master”的表,它保存架构信息.
/**
* Get all table Details from the sqlite_master table in Db.
*
* @return An ArrayList of table details.
*/
public ArrayList<String[]> getDbTableDetails() {
Cursor c = db.rawQuery(
"SELECT name FROM sqlite_master WHERE type='table'", null);
ArrayList<String[]> result = new ArrayList<String[]>();
int i = 0;
result.add(c.getColumnNames());
for (c.movetoFirst(); !c.isAfterLast(); c.movetoNext()) {
String[] temp = new String[c.getColumnCount()];
for (i = 0; i < temp.length; i++) {
temp[i] = c.getString(i);
}
result.add(temp);
}
return result;
}
更简单的方法是在模拟器上运行它.
>开放ddms观点
>查找数据/数据/ PACKAGENAME / database / YOURFILE
>单击图中右上角的数据库按钮.
打开
Android Sqlite数据库详解
什么是sqlite
Android自带的嵌入式数据库,可使用sql语言
怎么使用
sqlite通过sqliteOpenHelper类来管理数据库
sqliteOpenHelper 的常用方法
方法名 | 方法介绍 |
---|---|
getWritableDatabase() | 创建 or 打开 可读/写的数据库(通过 返回的sqliteDatabase对象 进行操作) |
getReadableDatabase() | 创建 or 打开 可读的数据库(通过 返回的sqliteDatabase对象 进行操作) |
onCreate(sqliteDatabase db) | 数据库第1次创建时 则会调用,即 第1次调用getWritableDatabase() 和 getReadableDatabase()时调用 在继承sqliteOpenHelper类的子类中复写 |
onUpgrade(sqliteDatabase db, int oldVersion, int newVersion) | 数据库升级时自动调用在继承sqliteOpenHelper类的子类中复写 |
close() | 关闭数据库 |
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) | 查询数据 |
(Cursor) rawQuery(String sql, String[] selectionArgs) | 运行一个预置的sql语句,返回带游标的数据集(与上面的语句最大的区别 = 防止sql注入) |
(int) delete(String table,String whereClause,String[] whereArgs) | 删除数据行 |
(long) insert(String table,String nullColumnHack,ContentValues values) | 添加数据行 |
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) | 更新数据行 |
(void) execsql(String sql) | 执行一个sql语句,可以是一个select or 其他sql语句 即 直接使用String类型传入sql语句 & 执行 |
实际使用
使用步骤
- 自定义数据库子类(继承sqliteOpenHelper类)
- 创建数据库
- 操作数据库(增删改查)
下面我们依次介绍
- 自定义数据库子类(继承sqliteOpenHelper类)
/**
* 创建数据库子类,继承自sqliteOpenHelper类
* 需 复写 onCreat()、onUpgrade()
*/
public class DatabaseHelper extends sqliteOpenHelper {
// 数据库版本号
private static Integer Version = 1;
/**
* 构造函数
* 在sqliteOpenHelper的子类中,必须有该构造函数
*/
public DatabaseHelper(Context context, String name, sqliteDatabase.CursorFactory factory,
int version) {
// 参数说明
// context:上下文对象
// name:数据库名称
// param:一个可选的游标工厂(通常是 Null)
// version:当前数据库的版本,值必须是整数并且是递增的状态
// 必须通过super调用父类的构造函数
super(context, name, factory, version);
}
/**
* 复写onCreate()
* 调用时刻:当数据库第1次创建时调用
* 作用:创建数据库 表 & 初始化数据
* sqlite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制
*/
@Override
public void onCreate(sqliteDatabase db) {
// 创建数据库1张表
// 通过execsql()执行sql语句(此处创建了1个名为person的表)
String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execsql(sql);
// 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
// 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
}
/**
* 复写onUpgrade()
* 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)
* 作用:更新数据库表结构
* 注:创建sqliteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade()
*/
@Override
public void onUpgrade(sqliteDatabase db, int oldVersion, int newVersion) {
// 参数说明:
// db : 数据库
// oldVersion : 旧版本数据库
// newVersion : 新版本数据库
// 使用 sql的ALTER语句
String sql = "alter table person add sex varchar(8)";
db.execsql(sql);
}
}
- 创建数据库
// 步骤1:创建DatabaseHelper对象
// 注:此时还未创建数据库
sqliteOpenHelper dbHelper = new DatabaseHelper(sqliteActivity.this,"test_carson");
// 步骤2:真正创建 / 打开数据库
sqliteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); // 创建 or 打开 可读/写的数据库
sqliteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); // 创建 or 打开 可读的数据库
- 操作数据库(增删改查)
1 插入数据库
/**
* 操作1:插入数据 = insert()
*/
// a. 创建ContentValues对象
ContentValues values = new ContentValues();
// b. 向该对象中插入键值对
values.put("id", 1);
values.put("name", "carson");
//其中,key = 列名,value = 插入的值
//注:ContentValues内部实现 = HashMap,区别在于:ContenValues Key只能是String类型,Value可存储基本类型数据 & String类型
// c. 插入数据到数据库当中:insert()
sqliteDatabase.insert("user", null, values);
// 参数1:要操作的表名称
// 参数2:sql不允许一个空列,若ContentValues是空,那么这一列被明确的指明为NULL值
// 参数3:ContentValues对象
// 使用sql语句插入
String sql = "insert into user (id,name) values (1,'carson')";
db.execsql(sql) ;
2 修改数据库
/**
* 操作2:修改数据 = update()
*/
// a. 创建一个ContentValues对象
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
// b. 调用update方法修改数据库:将id=1 修改成 name = zhangsan
sqliteDatabase.update("user", values, "id=?", new String[] { "1" });
// 参数1:表名(String)
// 参数2:需修改的ContentValues对象
// 参数3:WHERE表达式(String),需数据更新的行; 若该参数为 null, 就会修改所有行;?号是占位符
// 参数4:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符;
// 注:调用完upgrate()后,则会回调 数据库子类的onUpgrade()
// 注:也可采用sql语句修改
String sql = "update [user] set name = 'zhangsan' where id="1";
db.execsql(sql);
3 删除数据
/**
* 操作3:删除数据 = delete()
*/
// 删除 id = 1的数据
sqliteDatabase.delete("user", "id=?", new String[]{"1"});
// 参数1:表名(String)
// 参数2:WHERE表达式(String),需删除数据的行; 若该参数为 null, 就会删除所有行;?号是占位符
// 参数3:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符;
// 注:也可采用sql语句修改
String sql = "delete from user where id="1";
db.execsql(sql);
4 查询数据
/**
* 操作4:查询数据1 = rawQuery()
* 直接调用 SELECT 语句
*/
Cursor c = db.rawQuery("select * from user where id=?",new Stirng[]{"1"});
// 返回值一个 cursor 对象
// 通过游标的方法可迭代查询结果
if(cursor.movetoFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}
//Cursor对象常用方法如下:
c.move(int offset); //以当前位置为参考,移动到指定行
c.movetoFirst(); //移动到第一行
c.movetoLast(); //移动到最后一行
c.movetoPosition(int position); //移动到指定行
c.movetoPrevIoUs(); //移动到前一行
c.movetoNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //总数据项数
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值
// 通过游标遍历1个名为user的表
Cursor result=db.rawQuery("SELECT _id, username, password FROM user");
result.movetoFirst();
while (!result.isAfterLast()) {
int id=result.getInt(0);
String name=result.getString(1);
String password =result.getString(2);
// do something useful with these
result.movetoNext();
}
result.close();
// 若查询是动态的,使用该方法会复杂。此时使用 query() 会方便很多
// 注:无法使用sql语句,即db.execsql(sql);
/**
* 操作4:查询数据2 = query()
* 直接调用 SELECT 语句
*/
// 方法说明
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
// 参数说明
// table:要操作的表
// columns:查询的列所有名称集
// selection:WHERE之后的条件语句,可以使用占位符
// groupBy:指定分组的列名
// having指定分组条件,配合groupBy使用
// orderBy指定排序的列名
// limit指定分页参数
// distinct可以指定“true”或“false”表示要不要过滤重复值
// 所有方法将返回一个Cursor对象,代表数据集的游标
// 具体使用
Cursor cursor = sqliteDatabase.query("user", new String[] { "id","name" }, "id=?", new String[] { "1" }, null, null, null);
// 参数1:(String)表名
// 参数2:(String[])要查询的列名
// 参数3:(String)查询条件
// 参数4:(String[])查询条件的参数
// 参数5:(String)对查询的结果进行分组
// 参数6:(String)对分组的结果进行限制
// 参数7:(String)对查询的结果进行排序
// 注:无法使用sql语句,即db.execsql(sql);
5 关闭数据库
/**
* 操作5:关闭数据库 = close()
* 注:完成数据库操作后,记得调用close()关闭数据库,从而释放数据库的连接
*/
sqliteDatabase.close();
6 删除数据库
/**
* 操作6:删除数据库 = deleteDatabase()
*/
// 删除 名为person的数据库
deleteDatabase("test.db");
特别注意
- 除了“查询”,所有的数据库操作都可使用 sql 语句,即使用下列方法代替:
db.executesql(String sql);
db.executesql(String sql, Object[] bindArgs);
// sql语句中使用占位符,参数2 = 实际的参数集
- 使用建议:都使用sql语句,因为:sql语句 通用 & 简单
- 原生的方法insert()、delete()等方法具备多个参数,使用复杂
不会sql语句怎么办?
我总结了常用的sql语句
参考:https://www.jianshu.com/p/8e3f294e2828
我们今天的关于java – Android – 如何用表创建Sqlite数据库和用java实现sql创建数据表的分享就到这里,谢谢您的阅读,如果想了解更多关于Android SQLite数据库已损坏、android SQLite数据库总结、Android Sqlite数据库架构、Android Sqlite数据库详解的相关信息,可以在本站进行搜索。
本文标签: