GVKun编程网logo

java – Android – 如何用表创建Sqlite数据库(用java实现sql创建数据表)

7

对于java–Android–如何用表创建Sqlite数据库感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解用java实现sql创建数据表,并且为您提供关于AndroidSQLite数据库已

对于java – Android – 如何用表创建Sqlite数据库感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解用java实现sql创建数据表,并且为您提供关于Android SQLite数据库已损坏、android SQLite数据库总结、Android Sqlite数据库架构、Android Sqlite数据库详解的宝贵知识。

本文目录一览:

java – Android – 如何用表创建Sqlite数据库(用java实现sql创建数据表)

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数据库已损坏

Android SQLite数据库已损坏

此链接完全描述了我的问题: http://old.nabble.com/Android-database-corruption-td28044218.html#a28044218

现在大约有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数据库总结

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 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数据库详解

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数据库详解的相关信息,可以在本站进行搜索。

本文标签: