我目前正在尝试在Android应用中显示数据库信息 我希望以表格形式显示数据:
+----------+----------+-----+----------+
| column 1 | column 2 | ... | column n |
+----------+----------+-----+----------+
| xxxx | xxxx | ... | nnnn |
| yyyy | yyyy | ... | nnnn |
| .... | .... | ... | nnnn |
| zzzz | zzzz | ... | nnnn |
+----------+----------+-----+----------+
在查看信息HERE时,看起来我需要使用带有SimpleCursorAdapter的GridView。
因此,我创建了一个扩展SQLiteOpenHelper的DatabaseHelper类。在该类中,我有一个方法返回查询的Cursor:
public static final String DATABASE_NAME = "myDatabaseName";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "myDatabaseTableName";
public DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public static final String MY_QUERY = "SELECT * FROM " + TABLE_NAME;
public Cursor getDataCursor(){
SQLiteDatabase sqliteDB = this.getReadableDatabase();
return sqliteDB.rawQuery(MY_QUERY, null);
}
"教程的一部分"在Google Dev页面上说明:
例如,如果要创建人员姓名和电话号码的列表,则可以执行一个查询,该查询返回包含每个人的行的Cursor以及名称和数字的列。然后创建一个字符串数组,指定每个结果的布局中所需的Cursor列和一个整数数组,指定每个列应放置的相应视图
然后有这段代码:
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
所以,在我的MainActivity.java中,我创建了一个新的DatabaseHelper实例,并获得了一个Cursor:
DatabaseHelper myDBHelper = new DatabaseHelper(this);
Cursor myDataCursor = myDBHelper.getDataCursor();
我无法弄清楚的是," ContactsContract"在Google的上述片段中?我以为它可能是他们的光标,但我的光标没有"数据"或" CommonDataKinds"可用的方法。我在Google的API指南页面上做了一些探讨,看看他们在哪些方面定义了这些方法,但似乎找不到它们。我也无法弄清楚他们到底在哪里" R.layout.person_name_and_number"在同一个例子中。
感谢您花时间阅读。
修改
我已将此代码添加到MainActivity.java的代码中:
DatabaseHelper myDBHelper = new DatabaseHelper(this);
Cursor myDataCursor = myDBHelper.getDataCursor();
String[] fromColumns = {"_id", "columnA","columnB","...","columnN"};
int[] toViews = {R.id.id_textview, R.id.columnA_textview, R.id.columnB_textview, ... , R.id.columnN_textview};
SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.my_new_layout, myDataCursor, fromColumns, toViews, 0);
ListView myListView = (ListView) findViewById(R.id.row_of_data);
myListView.setAdapter(sca);
我创建了一个名为my_new_layout.xml的新视图:
<ListView android:id="@+id/row_of_data">
<TextView android:id="@+id/id_textview" />
<TextView android:id="@+id/columnA_textview" />
<TextView android:id="@+id/columnB_textview" />
...
<TextView android:id="@+id/columnN_textview" />
</ListView>
然后我将我的新视图添加到activity_main.xml
<include layout="@layout/"my_new_layout />
但是,现在当我尝试运行应用程序时,我收到错误:
java.lang.unsupportedoperationexception addview(view, layoutparams) is not supported in adapterview
我得到了这个错误,奇怪的是,我将新布局包含在activity_main.xml中。
答案 0 :(得分:1)
查看SimpleCursorAdapter
的{{3}}及其构造函数,您可以看到
public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags)
<强>参数强>
context
:与此SimpleListItemFactory关联的ListView正在运行的上下文layout
:布局文件的资源标识符,用于定义此列表项的视图。布局文件至少应包含“to”c
:数据库游标。如果光标尚不可用,则可以为null。from
:表示要绑定到UI的数据的列名列表。如果光标尚不可用,则可以为null。to
:应在“from”参数中显示列的视图。这些都应该是TextViews。此列表中的前N个视图被赋予from参数中前N列的值。如果光标尚不可用,则可以为null。flags
:根据CursorAdapter(Context,Cursor,int)用于确定适配器行为的标志。fromColumns 是您要从中获取数据的表格列的名称
toViews 是TextView
的ID,它们应位于行的XML布局中(构造函数中的第二个参数 - int layout
)。
两个数组中的项目数应该相同。
答案 1 :(得分:1)
首先,你的SQL命令不应该是这个。 "SELECT * FROM MyDatabase";
您的表名误导或逻辑错误。
"SELECT * FROM MyDatabase";
应该(逻辑上)"SELECT * FROM MyTable";
这可能就是为什么你的光标没有返回你期望的东西。
关于ContactsContract.CommonDataKinds.Phone.NUMBER
它只是一个包含常量的静态类。
以下模式允许您在一个有组织的位置拥有一个包含所有字符串的类。
这也可以帮助您通过允许IDE代码自动完成来帮助您不必“记住”每个变量名称/等。您可以自动完成它们以完成它们。这有助于集中您的常量,并且只有一个需要更改字符串值的位置。
所以例如(并且这只列出了1个值)
public class ContactsContract {
public class CommonDataKinds {
public class Phone {
public static final String NUMBER = "number";
}
}
}
更多信息:
以下是相关文件的javadoc:
https://developer.android.com/reference/android/provider/ContactsContract.html
以下是该文件的源代码(来自grep代码):
(正如你可以看到我上面的代码片段是正确的,除了我忘了每个课程final
......但我很接近)
这是另一个可能更清楚的例子:
我写了这段代码(不是我的回复...代码在我的博士顾问的回购中,并用于Coursera课程https://www.coursera.org/course/posasoftware)
我们的MOOC Schema
A file that uses it(即公众和学习者不必写)
正如您所看到的,架构类的好处是它允许第二类“使用”架构的内部字符串值,而无需直接处理字符串。这些文件之间仍然存在紧密耦合,但它允许您在一个地方对数据库进行更改(例如修复拼写错误等),而无需查看整个代码来查找要替换的字符串。 (也减少了代码中其他地方的拼写错误。)