需要帮助找出适配器"教程"在谷歌的Android开发者网站上

时间:2015-12-28 15:16:46

标签: android android-sqlite android-adapter android-gridview android-cursor

我目前正在尝试在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中。

2 个答案:

答案 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代码):

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/provider/ContactsContract.java

(正如你可以看到我上面的代码片段是正确的,除了我忘了每个课程final ......但我很接近)

这是另一个可能更清楚的例子:

我写了这段代码(不是我的回复...代码在我的博士顾问的回购中,并用于Coursera课程https://www.coursera.org/course/posasoftware

我们的MOOC Schema

A file that uses it(即公众和学习者不必写)

正如您所看到的,架构类的好处是它允许第二类“使用”架构的内部字符串值,而无需直接处理字符串。这些文件之间仍然存在紧密耦合,但它允许您在一个地方对数据库进行更改(例如修复拼写错误等),而无需查看整个代码来查找要替换的字符串。 (也减少了代码中其他地方的拼写错误。)