光标不显示秒 activity 中的数据
cursor is not displaying data in second activity
我有一个项目列表,数据存储在SQLite中。当我想获得项目的详细视图时出现问题,它不显示任何数据。
这是 activity,它在列表视图中显示数据库中的所有行,效果很好。
public class List extends Activity {
public final static String ID_EXTRA="com.example.bazadanych._ID";
DBAdapter myDB;
String passedV=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
passedV=getIntent().getStringExtra(MainActivity.ID_EXTRA);
openDB();
populateListViewDB ();
onclickcallback();
}
@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}
private void openDB() {
myDB = new DBAdapter(this);
myDB.open();
}
private void closeDB() {
myDB.close();
}
private void populateListViewDB() {
Cursor cursor = myDB.getAllRows();
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.list_item_name, R.id.list_item_country, R.id.list_item_region, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.list_item,
cursor,
fromFieldNames,
toViewIDs
);
ListView myList = (ListView) findViewById(R.id.listViewDB);
myList.setAdapter(myCursorAdapter);
}
private void onclickcallback() {
ListView myList = (ListView) findViewById(R.id.listViewDB);
myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked,
int position, long id) {
Intent intent = new Intent(List.this, Details.class);
intent.putExtra(ID_EXTRA, String.valueOf(id));
startActivity(intent);
}
});
}
}
从 List.class 单击列表中的项目后,用户可以移动到 details.class,它应该显示项目的详细信息。不幸的是,它没有显示任何内容,也没有给出任何错误。
我正在将一个 ID 从一个 activity 传递到另一个,它从一个移到另一个但后来不显示任何数据,
public class Details extends Activity {
DBAdapter myDB;
String passedV=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
passedV=getIntent().getStringExtra(List.ID_EXTRA);
myDB = new DBAdapter(this);
}
private void populatedetailsViewDB() {
Cursor cursor = myDB.getRow(0);
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_ADRESS, DBAdapter.KEY_PHONENUM, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.item_name, R.id.item_country, R.id.item_region, R.id.item_adress, R.id.item_phonenum, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.item_layout,
cursor,
fromFieldNames,
);
ListView myList = (ListView) findViewById(R.id.detailsViewDB);
myList.setAdapter(myCursorAdapter);
}
}
这是从 DBAdapter 获取一行。
public class DBAdapter {
...
public DBAdapter(Context ctx) {
this.context = ctx;
myDBHelper = new DatabaseHelper(context);
}
// Open the database connection.
public DBAdapter open() {
db = myDBHelper.getWritableDatabase();
return this;
}
// Close the database connection.
public void close() {
myDBHelper.close();
}
...
public Cursor getRow(long rowId) {
String where = KEY_ROWID + "=" + rowId;
Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
谁能看出可能是什么问题?
所以您在 DBAdapter class 的 getRow 方法上查询数据库,其中 returns 一个游标指向单行。但是在您的详细信息 activity 中,您总是调用 getRow(0),而不是项目的实际行。
您可能想要更改此方法:
private void populatedetailsViewDB() {
myDB.open();
Cursor cursor = myDB.getRow(Long.parseLong (passedV));
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_ADRESS, DBAdapter.KEY_PHONENUM, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.item_name, R.id.item_country, R.id.item_region, R.id.item_adress, R.id.item_phonenum, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.item_layout,
cursor,
fromFieldNames,
);
ListView myList = (ListView) findViewById(R.id.detailsViewDB);
myList.setAdapter(myCursorAdapter);
myDB.close();
}
我有一个项目列表,数据存储在SQLite中。当我想获得项目的详细视图时出现问题,它不显示任何数据。 这是 activity,它在列表视图中显示数据库中的所有行,效果很好。
public class List extends Activity {
public final static String ID_EXTRA="com.example.bazadanych._ID";
DBAdapter myDB;
String passedV=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
passedV=getIntent().getStringExtra(MainActivity.ID_EXTRA);
openDB();
populateListViewDB ();
onclickcallback();
}
@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}
private void openDB() {
myDB = new DBAdapter(this);
myDB.open();
}
private void closeDB() {
myDB.close();
}
private void populateListViewDB() {
Cursor cursor = myDB.getAllRows();
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.list_item_name, R.id.list_item_country, R.id.list_item_region, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.list_item,
cursor,
fromFieldNames,
toViewIDs
);
ListView myList = (ListView) findViewById(R.id.listViewDB);
myList.setAdapter(myCursorAdapter);
}
private void onclickcallback() {
ListView myList = (ListView) findViewById(R.id.listViewDB);
myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked,
int position, long id) {
Intent intent = new Intent(List.this, Details.class);
intent.putExtra(ID_EXTRA, String.valueOf(id));
startActivity(intent);
}
});
}
}
从 List.class 单击列表中的项目后,用户可以移动到 details.class,它应该显示项目的详细信息。不幸的是,它没有显示任何内容,也没有给出任何错误。
我正在将一个 ID 从一个 activity 传递到另一个,它从一个移到另一个但后来不显示任何数据,
public class Details extends Activity {
DBAdapter myDB;
String passedV=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
passedV=getIntent().getStringExtra(List.ID_EXTRA);
myDB = new DBAdapter(this);
}
private void populatedetailsViewDB() {
Cursor cursor = myDB.getRow(0);
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_ADRESS, DBAdapter.KEY_PHONENUM, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.item_name, R.id.item_country, R.id.item_region, R.id.item_adress, R.id.item_phonenum, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.item_layout,
cursor,
fromFieldNames,
);
ListView myList = (ListView) findViewById(R.id.detailsViewDB);
myList.setAdapter(myCursorAdapter);
}
}
这是从 DBAdapter 获取一行。
public class DBAdapter {
...
public DBAdapter(Context ctx) {
this.context = ctx;
myDBHelper = new DatabaseHelper(context);
}
// Open the database connection.
public DBAdapter open() {
db = myDBHelper.getWritableDatabase();
return this;
}
// Close the database connection.
public void close() {
myDBHelper.close();
}
...
public Cursor getRow(long rowId) {
String where = KEY_ROWID + "=" + rowId;
Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
谁能看出可能是什么问题?
所以您在 DBAdapter class 的 getRow 方法上查询数据库,其中 returns 一个游标指向单行。但是在您的详细信息 activity 中,您总是调用 getRow(0),而不是项目的实际行。
您可能想要更改此方法:
private void populatedetailsViewDB() {
myDB.open();
Cursor cursor = myDB.getRow(Long.parseLong (passedV));
startManagingCursor(cursor);
String[] fromFieldNames = new String[]
{DBAdapter.KEY_NAME, DBAdapter.KEY_COUNTRY, DBAdapter.KEY_REGION, DBAdapter.KEY_ADRESS, DBAdapter.KEY_PHONENUM, DBAdapter.KEY_PHONE};
int [] toViewIDs = new int []
{R.id.item_name, R.id.item_country, R.id.item_region, R.id.item_adress, R.id.item_phonenum, R.id.list_icon_item};
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.item_layout,
cursor,
fromFieldNames,
);
ListView myList = (ListView) findViewById(R.id.detailsViewDB);
myList.setAdapter(myCursorAdapter);
myDB.close();
}