结果集到 Android 光标

Posted

技术标签:

【中文标题】结果集到 Android 光标【英文标题】:ResultSet to Android Cursor 【发布时间】:2013-10-09 07:16:11 【问题描述】:

我从我的 android 应用程序连接到 PC 上的 mysql 数据库。

我为此使用 java.sql.jdb。现在我希望我的结果集进入 android.database.cursor??

我该怎么做..?? 这就是我在 android 应用程序中使用的代码,它获取数据库的结果但无法转换为光标:

    Connection connect = null;
    ResultSet resultSet = null;
    Statement statement = null;

    try 
        connect = DriverManager.getConnection("jdbc:mysql://"+DbHelper.DB_Path+"/"+DbHelper.DB_Name+"?"
                + "user="+ DbHelper.DB_UserName+ "&password="+ DbHelper.DB_Pass);


        statement = connect.createStatement();
        // Result set get the result of the SQL query
        resultSet = statement
                .executeQuery("Select * from btag_store "+
                        "Where "+
                        "guid='"+filterArgs+"'");


        
     catch (SQLException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
    

    Cursor cc;
    cc = (Cursor) resultSet; // error in type casr

我知道类型转换会给我带来错误,但是还有其他方法吗..??

谢谢

【问题讨论】:

【参考方案1】:

简单地说,你不能。除非您愿意做所有的工作来定义一个实现Cursor 接口并使用ResultSet 来实现Cursor 的实现细节的对象。不过,这有点愚蠢,因为ResultSet 对象已经设计为迭代从数据库返回的结果。最简洁的方法是按预期使用 ResultSet 对象。

【讨论】:

【参考方案2】:

戴夫说的是对的。我的数据库项目是在 Cursor (Sqlite) 上构建的,但我需要与 MySQL 相同的入口点。所以我尝试了这个:

我创建了一个基类 AbstractCursorGen.java

import android.database.Cursor;

import java.sql.ResultSet;

public abstract class AbstractCursorGen 
    protected Cursor c;
    protected ResultSet rs;
    public abstract int getColumnIndex(String iName);
    public abstract String getString(String iName);
    public abstract int getInt(String iName);
    public abstract long getLong(String iName);
    public abstract boolean moveToNext();
    public abstract void close();

然后使用 Cursor 的将持有 cursor 的实例。获得直接给出列字符串的结果还有一个额外的好处。我的代码将此用于 SQLite。

CursonGen.Java

import android.database.Cursor;

public class CursorGen extends AbstractCursorGen
    public CursorGen(Cursor c)
    
        this.c = c;
    

    public int getColumnIndex(String iName)
    
        return c.getColumnIndex(iName);
    


    public String getString(String iName)
        return c.getString(getColumnIndex(iName));
    

    public int getInt(String iName)
        return c.getInt(getColumnIndex(iName));
    
    public long getLong(String iName)
        return c.getLong(getColumnIndex(iName));
    

    public boolean moveToNext()
    
        return c.moveToNext();
    

    public void close()
    
        c.close();
    

一个建立在结果集之上。这用于 MySQL 结果

ResultSetGen.java

import android.util.Log;

import java.sql.ResultSet;
import java.sql.SQLException;

public class ResultSetGen extends AbstractCursorGen
    public ResultSetGen(ResultSet rs)
    
        this.rs = rs;
    

    public int getColumnIndex(String iName)
    
        try 
            return rs.findColumn(iName);
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
            return -1;
        
    


    public String getString(String iName)
        try 
            return rs.getString(getColumnIndex(iName));
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
            return null;
        
    

    public int getInt(String iName)
        try 
            return rs.getInt(getColumnIndex(iName));
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
            return -1;
        
    
    public long getLong(String iName)
        try 
            return rs.getLong(getColumnIndex(iName));
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
            return -1;
        
    

    public boolean moveToNext()
    
        try 
            return rs.next();
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
            return false;
        
    

    public void close()
    
        try 
            rs.close();
         catch (SQLException ex)
        
            Log.e("PROX","Column not found");
        
    

诀窍是只为我实际使用的方法提供实现。

这最终被(一个例子)调用

public Person(AbstractCursorGen cursor)
    
       setFromCursor(cursor);
    

    protected void setFromCursor(AbstractCursorGen cursor)
    
        PersonID        = cursor.getLong    (   COLUMN_PERSON_ID);
        ClusterID       = cursor.getInt     (   COLUMN_CLUSTER_ID);
        Name            = cursor.getString  (   COLUMN_NAME);
        .....
    

希望这会有所帮助。

【讨论】:

以上是关于结果集到 Android 光标的主要内容,如果未能解决你的问题,请参考以下文章

FMDB 结果集到字典中

参考光标和结果集

从接收的结果集(光标)返回SP中的结果集

可以通过查询结果获取结果集行数吗?

ResultMap

ssm mapper.xml讲解