如何检测字段是否为主键

时间:2013-05-23 06:30:14

标签: android sqlite

我的问题是,通过查看光标可以知道字段是表的主键。或者我们如何知道哪个字段是主键?

我想写一个类似的课程。所以我必须以编程方式学习它

public class BO {

private HashMap<String, Object> data;
private String primaryKey="";


public BO() {
    data=new HashMap<String, Object>();
}

public String getUpdateQuery() {
    return null;
}

public String getInsertQusery() {
    return null;
}

public String getPrimaryKey() {
    return primaryKey;
}

public void setPrimaryKey(String primaryKey) {
    this.primaryKey = primaryKey;
}

public int getLogicalReference() {
    return logicalReference;
}

public void loadDataFromCursor(Cursor cur){
    String[] fields=cur.getColumnNames();
    for(int i=0;i<fields.length;i++){
        switch (cur.getType(i)) {
        case Cursor.FIELD_TYPE_INTEGER:
            data.put(fields[i], cur.getInt(i));
            break;

        default:
            break;
        }
    }
}

public void setLogicalReference(int logicalReference) {
    this.logicalReference = logicalReference;
}

}

2 个答案:

答案 0 :(得分:0)

就像CL一样。在他的评论中说,我相信光标不会持有这些信息。列是否包含主键与表结构有关,该表结构与表的内容不同。 Cursor用于访问数据,不提供有关表结构的信息。

此外,Android中的Cursor接口不一定与SQLiteDatabase相关,因此您无法从中获取此类信息。

但是,我不能想到任何有用的用例。也许某种牵强的代码通用性;无论如何,你很有可能重新考虑你的设计(如果你真的认为它是正确的,那就解释一下;在这种情况下,我很好奇!)

答案 1 :(得分:0)

这是使用Python和Mysql的示例。

pkey = cursor.execute("SHOW KEYS FROM " + tablename + " WHERE Key_name = 'PRIMARY'")

以及用例:

Query =  "INSERT INTO table " + str(tuple(table[0].keys()))
Query += "\nVALUES\n"
Query += str(tuple(table[0].values()))
Query += "\nON DUPLICATE KEY UPDATE\n"
for key in table[0].keys():
   if not key in pkey:
       Query += key + " = VALUES(" + key + "),\n"
Query = Query.rstrip(",")
cursor.execute(Query)

结果字符串将插入或更新表。如果您尝试将主键推到表中,则会引发“重复主键”错误。我的程序正在解析JSON文件的目录,并将其导入数据库作为API检索过程的一部分。我正在从3个不同的API中提取数据,并希望保持代码的通用性,以便我可以重用它。

我对SQLLite不太熟悉,但是您可以通过为主键命名一个表明它是主键的内容来实现为您执行的操作:例如pk_id,然后将字段名称解析为查找是否包含pk。