- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建 android 应用程序,它似乎将 Force Close
保持在同一位置 (setListAdapter/SimpleCursorAdapter
) 现在不管我做什么。这是 DBAdapter
、ListActivity
和布局 (list/list row
),还有 Eclipse LogCat 文件。我不确定是什么导致它无法运行或为什么它不会运行:
DBAdapter:
package com.m4ltech.PasswordGenerator;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class PG_DBAdapter {
private static final String dbName = "PsdGen.db";
private static final int Database_Version = 2;
private static final String CatTbl = "CatTbl";
private static final String tempPswdTable = "tmpPswdTbl";
private static final String PswdGenTable = "PswdGenTable";
public static final String colID = "_CatID";
public static final String catName = "CatName";
public static final String tempID = "_tempId";
public static final String tmpPswd = "tmpPswd";
public static final String PswdGen_ID = "_pswdgenID";
public static final String Comp_Site = "company_site";
public static final String UserName = "uname";
public static final String Category = "category";
public static final String Pswd = "password";
private static final String TAG = "PG_DBAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) { super(context, dbName, null, Database_Version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + CatTbl + "(" + colID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + catName
+ " text not null )");
db.execSQL("CREATE TABLE " + tempPswdTable + "(" + tempID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + tmpPswd + " text not
null )");
db.execSQL("CREATE TABLE " + PswdGenTable + "(" + PswdGen_ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + Comp_Site
+ " text not null, " + UserName + " text not null, "
+ Category + " text not null, " + Pswd + " text not null )");
InsertCategories(db);
InsertPswdStarter(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + PswdGenTable);
db.execSQL("DROP TABLE IF EXISTS " + tempPswdTable);
db.execSQL("DROP TABLE IF EXISTS " + CatTbl);
onCreate(db); } }
public PG_DBAdapter(Context ctx) { this.mCtx = ctx;
}
public PG_DBAdapter open() throws SQLException {mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase(); return this;
}
public void close() { mDbHelper.close(); }
public long createSavedPswd(String company_site, String uname,
String category, String password) {
ContentValues initialValues = new ContentValues();
initialValues.put(Comp_Site, company_site);
initialValues.put(UserName, uname);
initialValues.put(Category, category);
initialValues.put(Pswd, password);
return mDb.insert(PswdGenTable, null, initialValues);
}
public boolean deletePassword(long rowId) { return mDb.delete(PswdGenTable, PswdGen_ID
+ "=" + rowId, null) > 0; }
public Cursor fetchAllPasswords() {
return mDb.query(PswdGenTable, new String[] { PswdGen_ID, Comp_Site, UserName,
Category, Pswd }, null, null, null, null, null, null);
}
public Cursor fetchPassword(long rowId) throws SQLException {
Cursor mCursor = mDb.query(true, PswdGenTable, new String[] {
PswdGen_ID, Comp_Site, UserName, Category, Pswd }, PswdGen_ID
+ " = " + rowId, null, null, null, null, null);
if (mCursor != null) { mCursor.moveToFirst(); }
return mCursor;
}
public boolean updatePassword(long rowId, String uname, String category,
String comp_site, String password) { ContentValues args = new ContentValues();
arrgs.put(Comp_Site, comp_site); args.put(UserName, uname); args.put(Category,
category); args.put(Pswd, password); return mDb.update(PswdGenTable, args,
PswdGen_ID + " = " + rowId, null) > 0;
}
static void InsertCategories(SQLiteDatabase db) {
ContentValues cv = new ContentValues();
cv.put(colID, 1);
cv.put(catName, "Bussiness Web");
db.insert(CatTbl, null, cv);
cv.put(colID, 2);
cv.put(catName, "Bussiness");
db.insert(CatTbl, null, cv);
cv.put(colID, 3);
cv.put(catName, "Personal Web");
db.insert(CatTbl, null, cv);
cv.put(colID, 4);
cv.put(catName, "Personal");
db.insert(CatTbl, null, cv);
}
static void InsertPswdStarter(SQLiteDatabase db) {
ContentValues cv = new ContentValues();
cv.put(PswdGen_ID, 1);
cv.put(Comp_Site, "AOL");
cv.put(UserName, "bsullivan");
cv.put(Category, "Bussiness Web");
cv.put(Pswd, "Ksj6LmKJ");
db.insert(PswdGenTable, null, cv);
cv.put(PswdGen_ID, 2);
cv.put(Comp_Site, "MSN");
cv.put(UserName, "sullivanb");
cv.put(Category, "Personal Web");
cv.put(Pswd, "KJKsj6Lm");
db.insert(PswdGenTable, null, cv);
}
}
ListActivity
package com.m4ltech.PasswordGenerator;
import com.m4ltech.PasswordGenerator.R;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Toast;
public class PGListActivity extends ListActivity {
private static final int ACTIVITY_CREATE = 0;
private static final int ACTIVITY_EDIT = 1;
private PG_DBAdapter mDbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
mDbHelper = new PG_DBAdapter(this);
mDbHelper.open();
fillData();
registerForContextMenu(getListView());
}
private void fillData() {
Cursor passwordsCursor = mDbHelper.fetchAllPasswords();
startManagingCursor(passwordsCursor);
String[] from = new String[] { PG_DBAdapter.Comp_Site};
int[] to = new int[] { R.id.comp_site_row};
SimpleCursorAdapter passwords = new SimpleCursorAdapter(this, R.layout.list_row,
passwordsCursor, from, to); setListAdapter(passwords);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_insert:
createPassword();
return true;
case R.id.menu_settings:
Intent l = new Intent(this, PGPreferences.class);
startActivity(l);
return true;
}
return super.onMenuItemSelected(featureId, item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.mainmenuitemlngpres, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deletePassword(info.id);
fillData();
return true; }
return super.onContextItemSelected(item); }
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, PGEditActivity.class);
i.putExtra(PG_DBAdapter.PswdGen_ID, id);
startActivityForResult(i, ACTIVITY_EDIT); }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
fillData(); }
private void createPassword() {
Intent i = new Intent(this, PGEditActivity.class);
startActivityForResult(i, ACTIVITY_CREATE); }
}
list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/comp_site_row" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:padding="10dip" />
列表.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_gravity="center" android:background="@color/background"
android:orientation="vertical" android:paddingTop="4dp" >
<ListView
android:id="@+id/android:list" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:id="@+id/android:empty" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:text="@string/no_pswd_gen"
android:textColor="#000000" />
</LinearLayout>
日志:
02-25 22:59:00.515: E/AndroidRuntime(274): FATAL EXCEPTION: main
02-25 22:59:00.515: E/AndroidRuntime(274): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.m4ltech.PasswordGenerator/com.m4ltech.PasswordGenerator.PGListActivity}:
java.lang.IllegalArgumentException: column '_id' does not exist
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.ActivityThread.performLaunchActivity
(ActivityThread.java:2663)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.ActivityThread.handleLaunchActivity
(ActivityThread.java:2679)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.ActivityThread.access$2300
(ActivityThread.java:125)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.ActivityThread$H.handleMessage
(ActivityThread.java:2033)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.os.Looper.loop(Looper.java:123)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.ActivityThread.main
ActivityThread.java:4627)
02-25 22:59:00.515: E/AndroidRuntime(274): at java.lang.reflect.Method.invokeNative(Native
Method)
02-25 22:59:00.515: E/AndroidRuntime(274): at java.lang.reflect.Method.invoke(Method.java:521)
02-25 22:59:00.515: E/AndroidRuntime(274): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-25 22:59:00.515: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit.main
(ZygoteInit.java:626)
02-25 22:59:00.515: E/AndroidRuntime(274): at dalvik.system.NativeStart.main(Native Method)
02-25 22:59:00.515: E/AndroidRuntime(274): Caused by: java.lang.IllegalArgumentException:
column '_id' does not exist
02-25 22:59:00.515: E/AndroidRuntime(274): at
android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.widget.CursorAdapter.init
(CursorAdapter.java:111)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.widget.CursorAdapter.<init>
(CursorAdapter.java:90)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.widget.ResourceCursorAdapter.<init>
(ResourceCursorAdapter.java:47)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.widget.SimpleCursorAdapter.<init>
(SimpleCursorAdapter.java:84)
02-25 22:59:00.515: E/AndroidRuntime(274): at
com.m4ltech.PasswordGenerator.PGListActivity.fillData(PGListActivity.java:51)
02-25 22:59:00.515: E/AndroidRuntime(274): at
com.m4ltech.PasswordGenerator.PGListActivity.onCreate(PGListActivity.java:39)
02-25 22:59:00.515: E/AndroidRuntime(274): at android.app.Instrumentation.callActivityOnCreate
(Instrumentation.java:1047)
02-25 22:59:00.515: E/AndroidRuntime(274): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
最佳答案
游标适配器(例如 SimpleCursorAdapter)要求提供的游标中存在一个 _id 列。
如果 _id 列不存在,您需要将其添加到您的表中,或者如果存在,则在您的 SELECT 语句中包含该列。
对于 future 的问题,请仔细检查 logcat:
ComponentInfo{com.m4ltech.PasswordGenerator/com.m4ltech.PasswordGenerator.PGListActivity}:
java.lang.IllegalArgumentException: column '_id' does not exist
关于安卓 setListAdapter/SimpleCursorAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451185/
import android.app.Activity; import android.os.Bundle; import android.app.ListActivity; import andro
我正在尝试构建 android 应用程序,它似乎将 Force Close 保持在同一位置 (setListAdapter/SimpleCursorAdapter) 现在不管我做什么。这是 DBAda
我有一个 Activity,其布局包含一个 DrawerLayout(来自支持的库)和一个 FrameLayout + ListView。在我的 FrameLayout 中,我有一个 ListFrag
这里我有一个奇怪的问题,有一种方法可以刷新我的 ListView : setListAdaptor(); 每当我从我的服务中调用此方法(以正确的方式)时,每当存在更改以更新列表时: @Overr
我尝试在 fragment 中显示 listView。但是方法 setListAdapter - 没有解决。我认为,我必须获取 listView 的 id (android.R.id.list);然后
在我的应用程序中,4 个 fragment 附加到一个 Activity 类。在我的 Activity 类中,我使用这个设置了根内容 View setContentView(R.layout.frag
我的 ListActivity 有问题,我使用一个线程来显示 ProgressDialog,其中获取所有已安装应用程序的列表。我把它变成一个列表适配器,然后我想设置 Activity 的列表适配器,但
正如标题所述,我在将我的数据从数据库链接到 ListView 时遇到了一些问题,问题在于适配器将仅设置返回的最后一行,而不是数据库表中的每一行。 我正在努力实现的一个例子: 餐 table 动物:猴猫
嗨,我正在尝试让我的 ListView 在我的 MainActivity 中使用 json。我的 onPostExecute(string result) 方法 出现错误。它给我以下错误:“MainA
我不知道发生了什么我首先在扩展 Activity 的类中发布了它。但即使将其更改为 ListActivity 后它仍然不起作用。我会把它简化到我认为问题所在的地方。 public class Pa
我正在开发一个应用程序,该应用程序(在 AsyncTask 中)执行对远程服务器的查询以获取 JSON 字符串。为了在我的 ListView 上显示数据,我扩展了一个 ArrayAdapter。 当我
我有一个 ListFragment,其数据由自定义适配器填充(在我的例子中是 SimpleAdapter)。我在扩展 ListFragment 的类中使用 notifyDataSetChanged()
我的程序具有 listArray 功能和 extends AppCompatActivity 但我的代码有错误 我的代码 新闻 Activity public class NewsActivity e
list_item.xml:http://pastebin.com/bn56L3NN 在 onCreate() 和创建 Comm 对象之后发生的情况是,我收到一条“已建立连接”消息,该消息在另一个线程
protected void onPostExecute(String file_url) { // dismiss the dialog after getting all prod
我有一个 Activity 类,其中包含一个扩展 AsyncTask 的内部 protected 类。当我单击一个按钮然后显示基于该数据的列表时,我试图让 AsyncTask 在后台加载数据。 这是我
我有一个 ListView ,它只是这样填充的: setListAdapter(new ArrayAdapter(this, android.R.layout.simp
我在 MainAvtivity 中有以下代码: private DBOperations DataDBoperation; @Override protected void onCre
当我尝试使用标题中列出的任一方法(getListView() 和 setListAdapter())时,我收到一条错误消息,指出这些方法无法解析。 这是我的代码: public void onRes
我制作了一个 ListView 来显示来自 url 的已解析 JSON 数据!相同的代码在没有 fragment 的情况下工作正常,但有 fragment 时 setListAdapter 不工作!我
我是一名优秀的程序员,十分优秀!