当列明显存在时,Android SQlite返回-1和getColumnIndex
将临时值插入到我的表中的所有列时,它似乎起作用。请参阅下面的方法和下面的日志。但是当我使用下面的测试方法测试该列是否存在时,它返回一个false,表示该列存在 第一段代码显示了调用临时值和测试列是否存在的方法的位置。下面的代码段包括日志、如何创建表以及调用的方法。谢谢大家!当列明显存在时,Android SQlite返回-1和getColumnIndex,android,mysql,sqlite,Android,Mysql,Sqlite,将临时值插入到我的表中的所有列时,它似乎起作用。请参阅下面的方法和下面的日志。但是当我使用下面的测试方法测试该列是否存在时,它返回一个false,表示该列存在 第一段代码显示了调用临时值和测试列是否存在的方法的位置。下面的代码段包括日志、如何创建表以及调用的方法。谢谢大家! ContentValues values = setContVal_All_Columns(myTable); //create row long insertId = database.insert(myTable, n
ContentValues values = setContVal_All_Columns(myTable);
//create row
long insertId = database.insert(myTable, null, values);
System.out.println("Column date exists = " + String.valueOf(doesColumnExist(myTable,"date")));
setContVal\u所有列方法:
//sets generic content values to initialize row = excluding ID column
private ContentValues setContVal_All_Columns(String myTable) {
ContentValues contentValues = new ContentValues();
Cursor cursor = database.query(myTable,null,null,null,null,null,null);
String[] columnNames = cursor.getColumnNames();
cursor.moveToFirst();
for(String name : columnNames) {
if(!name.equals(IdColumn)) { //excludes Id column
int index = cursor.getColumnIndex(name);
System.out.println("Column name = " + name + " index = " + String.valueOf(index));
System.out.println("Type = " + String.valueOf(cursor.getType(index))); //appears to crash on the getType
if (cursor.getType(index) == 3) { //String
System.out.println("Column is string");
contentValues.put(name, " ");
} else if (cursor.getType(index) == 1) { //integer
contentValues.put(name, 0);
}
}
}
return contentValues;
}
测试列是否存在的方法:始终在日期列返回-1
private boolean doesColumnExist(String myTable, String myColumn) {
boolean doesExist = true;
Cursor cursor = database.rawQuery("PRAGMA table_info(" + myTable + ")",null);
cursor.moveToFirst();
int value = cursor.getColumnIndex(myColumn);
if(value == -1)
{
doesExist = false;
}
return doesExist;
}
日志信息:
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = date index = 1
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 0
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = name index = 2
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 3
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column is string
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = altitude index = 3
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 0
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = is_used index = 4
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 0
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = warning index = 5
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 0
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column name = action index = 6
02-16 19:58:42.296 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Type = 0
02-16 19:58:42.316 9711-9711/com.mycompany.dudesmyreminders I/System.out﹕ Column date exists = false
表格创建方法:
//Database creation sql statement
private static final String SQL_CREATE_SPECIAL_DAYS =
"CREATE TABLE " + dbFields.TABLE_NAME_SPECIAL_DAYS + " (" +
dbFields.COLUMN_SPECIAL_DAYS_ID + INTEGER_PRIMARY_KEY + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_DATE + TEXT_TYPE + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_NAME + TEXT_TYPE + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_ALTITUDE + INTEGER_TYPE + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_USED + INTEGER_TYPE + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_WARNING + INTEGER_TYPE + COMMA_SEP +
dbFields.COLUMN_SPECIAL_DAYS_ACTION + INTEGER_TYPE +
// Any other options for the CREATE command
" )";
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(SQL_CREATE_SPECIAL_DAYS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(MySQLiteHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + dbFields.TABLE_NAME_SPECIAL_DAYS);
onCreate(db);
}
与
假设PRAGMA
将返回一行中的所有列。这就是它的工作原理。从PRAGMA
文档
PRAGMA table_info为命名表中的每列返回一行。结果集中的列包括列名、数据类型、列是否可以为NULL以及列的默认值
因此,您的doesColumnExist()
方法应该如下所示
boolean doesExist = false;
Cursor cursor = database.rawQuery("PRAGMA table_info(" + myTable + ")",null);
while (cursor.moveToNext()) {
if (cursor.getString(cursor.getColumnIndex("name")).equals(myColumn)) {
doesExist = true;
break;
}
}
cursor.close();
return doesExist;
另外,不要忘记关闭光标s.
假设PRAGMA
将返回一行中的所有列。这就是它的工作原理。从PRAGMA
文档
PRAGMA table_info为命名表中的每列返回一行。结果集中的列包括列名、数据类型、列是否可以为NULL以及列的默认值
因此,您的doesColumnExist()
方法应该如下所示
boolean doesExist = false;
Cursor cursor = database.rawQuery("PRAGMA table_info(" + myTable + ")",null);
while (cursor.moveToNext()) {
if (cursor.getString(cursor.getColumnIndex("name")).equals(myColumn)) {
doesExist = true;
break;
}
}
cursor.close();
return doesExist;
另外,不要忘记关闭SQLite文档中的光标
PRAGMA table_info(表名)
该杂注为命名表中的每列返回一行
因此,PRAGMA查询的结果大致如下所示:
|-------------------------------------------------------
|cid | name | type | not null | dflt_value | pk | // <-- you're trying to find your column names here, but instead they are in each of the rows
|-------------------------------------------------------
| 1 | date | text | 1 | | 0 |
|-------------------------------------------------------
| 2 | name | text | 0 | | 0 |
|-------------------------------------------------------
| 3 | altitude | integer | 1 | | 0 |
|-------------------------------------------------------
.......
|-------------------------------------------------------
|-------------------------------------------------------
|SQLite文档中的cid | name | type | not null | dflt|u value | pk |/:
PRAGMA table_info(表名)
该杂注为命名表中的每列返回一行
因此,PRAGMA查询的结果大致如下所示:
|-------------------------------------------------------
|cid | name | type | not null | dflt_value | pk | // <-- you're trying to find your column names here, but instead they are in each of the rows
|-------------------------------------------------------
| 1 | date | text | 1 | | 0 |
|-------------------------------------------------------
| 2 | name | text | 0 | | 0 |
|-------------------------------------------------------
| 3 | altitude | integer | 1 | | 0 |
|-------------------------------------------------------
.......
|-------------------------------------------------------
|-------------------------------------------------------
|cid | name | type | not null | dflt_value | pk |//当使用PRAGMA table_info(…)
时,您将得到6列(cid、name、type、notnull、dflt_value、pk)。表中的所有列名都显示在“名称”列下。尝试某种SQLite浏览器工具,自己查看结果。:)你是说显示数据库的应用程序吗?我下载了它,但找不到我一生(我在HTC上测试)的文件,一个桌面应用程序来显示数据库。您可能无法在设备上找到它,因为它将位于专用存储中。只需使用桌面应用程序创建一个简单的数据库和表,然后运行PRAGMA table_info
查询,看看会发生什么-所有表列名都在名为“name”的PRAGMA table_info
数据集的一列中。听起来我创建表的方式有问题吗?基本上,我想要一个表,有列指示,其中每一行包含所有列。。。这一切都在一起。看起来很奇怪,不可能查看实际的数据库。你知道有哪种表格创建方法更符合我的要求吗。。。我应该在我的问题中添加一个图表吗?当使用PRAGMA table\u info(…)
时,您将得到6列(cid、name、type、notnull、dflt\u value、pk)。表中的所有列名都显示在“名称”列下。尝试某种SQLite浏览器工具,自己查看结果。:)你是说显示数据库的应用程序吗?我下载了它,但找不到我一生(我在HTC上测试)的文件,一个桌面应用程序来显示数据库。您可能无法在设备上找到它,因为它将位于专用存储中。只需使用桌面应用程序创建一个简单的数据库和表,然后运行PRAGMA table_info
查询,看看会发生什么-所有表列名都在名为“name”的PRAGMA table_info
数据集的一列中。听起来我创建表的方式有问题吗?基本上,我想要一个表,有列指示,其中每一行包含所有列。。。这一切都在一起。看起来很奇怪,不可能查看实际的数据库。你知道有哪种表格创建方法更符合我的要求吗。。。我应该在我的问题中添加一个图表吗?我剪切并粘贴了你最新的编辑,得到了相同的结果。我们正在尝试获取列“name”,对吗?否,name是结果集中的列名,其中一行的值将与您的列名匹配。尽管“name”给出了一个错误:游标中的getString(int)无法应用于(java.lang.String)否,请使用Cursor.getString(Cursor.getColumnIndex(“name”))
取而代之。我剪切并粘贴了您最近的编辑,得到了相同的结果,是的,得到了。我们正在尝试获取列“name”,对吗?否,name是结果集中的列名,其中一行的值将与您的列名匹配。尽管“name”给出了一个错误:游标中的getString(int)无法应用于(java.lang.String)否,请使用Cursor.getString(Cursor.getColumnIndex(“name”))
相反。这是对我的数据库设置的准确描述吗?看起来可能是您刚刚编辑了图表?这些只是前四列,是的,它们必须非常准确,这取决于您所说的“准确”的含义。列名是准确的。对不起,这个词用得太多了。你的图表很清楚。非常感谢。我可能需要问另一个问题,但是,我现在正在努力