【问题标题】:how to use rawQuery in android如何在android中使用rawQuery
【发布时间】:2014-11-13 16:49:11
【问题描述】:

我有一个包含 3 列的数据库表:id、名称、权限。

看起来像这样:

1 漫画乐趣

2 沟通交流

3 漫画观看

我正在尝试获得名称为漫画的许可。我在我的数据库类(AppData.java)中使用以下代码:

private final static String DB_NAME = "safety_app_database"; // the name of our database
private final static int DB_VERSION = 1; // the version of the database

// the names for our database columns
private final String TABLE_NAME = "permissions_table";
private final String ID = "id";
private final String NAME = "name";
private final String PERMISSION = "permission";

方法

public Cursor getData(){
        return db.rawQuery("SELECT permission FROM permissions_table WHERE name = 'Comics', null);
    }

我在我的主类 (safety.java) 中调用它。 AppData 正在引用 AppData.java

appData.getData();

这是正确的方法吗?我不确定,每当我尝试调用 sql 查询时它都会给我一个错误。

【问题讨论】:

    标签: android sql


    【解决方案1】:

    一个拼写错误,您没有用" 关闭sql 字符串。试试这个。

    return db.rawQuery("SELECT permission FROM permissions_table WHERE name = 'Comics' ", null);
    

    [编辑:JAR 属于“Android 2.2”,不允许修改其条目上的源附件]

    The Jar of this class file blongs to container Android 2.0.1 which does not allow modifications

    【讨论】:

    • 我相信你需要在这里用 \' 转义单引号
    • 不,它似乎不是我的 sql,我尝试使用以下代码,但它仍然给我一个错误 "public Cursor getData(){ return db.rawQuery("SELECT * FROM permissions_table" , null); " }
    • 另外,在原始查询中,或使用 execSQL 方法时,您必须以分号结束字符串。
    • @Niall:提出您收到的确切错误。这会对我们有所帮助。
    • 好的,当我通过调试器运行它时,它会给出一个 invocationTargetException 错误。它说 JAR 属于“Android 2.2”,不允许修改其条目上的源附件
    【解决方案2】:

    不需要原始查询。您可以使用推荐的 SQLiteDatabase 查询方法之一,它看起来像这样:

    db.query("permissions_table", new String [] {permission}, "name = \'Comics\'", null, null, null, null);
    

    【讨论】:

    • 不,这也不起作用,当我尝试运行它并调试它时,同样的错误。
    • 对不起,它说:AppData.getData(AppData.java:71) 处的 java.lang.NullPointerException
    • 你确定是这个数据库查询导致了错误吗?
    • 刚刚编辑了它所说的内容,是的,因为当我取出“appData.getData(...);”时一切正常行
    • 好的,如果你得到 NullPointerException,那么对象 appData 从未被实例化。如果您在 AppData 中调用它,为什么不使用 this.getData() 调用它呢?或者我想在某个地方,比如在 onCreate() 你必须有 appData = AppData.this;和 AppData appData 的全局声明;
    【解决方案3】:

    尝试以下方法:

    public Cursor getData(String arg) {
       return db.rawQuery("SELECT permission FROM `permissions_table` WHERE name ="+arg, null);
    }
    

    然后只需像这样使用正确的参数调用上述方法:

    Cursor cursor;
    
    cursor  =  getData ( "Comic" );
    

    【讨论】:

    【解决方案4】:

    要执行查询,有两种方法: 执行 db.rawQuery 方法 执行 db.query 方法 执行原始查询以检索所有部门:

    Cursor getAllDepts()
      {
       SQLiteDatabase db=this.getReadableDatabase();
       Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id, 
            "+colDeptName+" from "+deptTable,new String [] {});
    
       return cur;
      }
    

    rawQuery 方法有两个参数: String query:select 语句 String[] selection args:如果 select 语句中包含 WHERE 子句,则参数 注意 查询结果在 Cursor 对象中返回。在 select 语句中,如果表的主键列(id 列)的名称不是 _id,那么您必须使用 SELECT [Column Name] as _id 形式的别名,因为 Cursor 对象总是期望主键键列的名称为 _id,否则将引发异常。执行查询的另一种方法是使用 db.query 方法。从视图中选择某个部门的所有员工的查询如下:

    public Cursor getEmpByDept(String Dept) {
       SQLiteDatabase db=this.getReadableDatabase();
       String [] columns=new String[]{"_id",colName,colAge,colDeptName};
       Cursor c=db.query(viewEmps, columns, colDeptName+"=?", 
            new String[]{Dept}, null, null, null);
       return c;
      }
    

    db.query 具有以下参数: String Table Name:要针对 String [ ] 运行查询的表的名称 列:查询的投影,即要检索的列 String WHERE 子句:where 子句, if none pass null String [ ] selection args:WHERE子句的参数 String Group by:指定group by子句的字符串 String Have:指定HAVING子句的字符串 String Order By:字符串Order By by子句

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多