Java sqlite行ID与listview不匹配-ANDROID
这可能是一个蹩脚的问题,但我是一个初学者,似乎不了解我的应用程序的行为 我有一个SQLite数据库,在主活动中有一个列表视图。 在列表视图中,我显示列表编号(行id)和其他详细信息。 按下列表项后,将打开一个新的活动,该活动在文本视图中显示详细信息,并有两个用于删除和同步的图像按钮 在我删除任何条目之前,该应用程序工作正常 删除任何条目后,listview上的行id似乎不会更新行号。(如果删除第一行,顶部的行显示2(应该是1,因为它是新的第一行)) 但是,当我显示记录的详细信息时,结果是正确的。(列表中的第二项显示第2行) 此外,当我在列表视图中按下一个与我先前删除的位置相同的项目时,应用程序崩溃(假设我删除了第一个条目,之后每当我单击列表视图上的第一个项目以显示它时,应用程序崩溃) 应用程序崩溃时出现错误:Java sqlite行ID与listview不匹配-ANDROID,java,android,sqlite,android-listview,android-sqlite,Java,Android,Sqlite,Android Listview,Android Sqlite,这可能是一个蹩脚的问题,但我是一个初学者,似乎不了解我的应用程序的行为 我有一个SQLite数据库,在主活动中有一个列表视图。 在列表视图中,我显示列表编号(行id)和其他详细信息。 按下列表项后,将打开一个新的活动,该活动在文本视图中显示详细信息,并有两个用于删除和同步的图像按钮 在我删除任何条目之前,该应用程序工作正常 删除任何条目后,listview上的行id似乎不会更新行号。(如果删除第一行,顶部的行显示2(应该是1,因为它是新的第一行)) 但是,当我显示记录的详细信息时,结果是正确的。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aakashmaroti.fillup/com.example.aakashmaroti.fillup.DisplayDetails}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
我的主要活动
package com.example.aakashmaroti.fillup;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StartScreen extends ActionBarActivity implements View.OnClickListener {
FavoriteList favList = new FavoriteList();
TextView rid,ts,sd;
ListView lv;
Context context=this;
Find db=new Find(this);
List<FavoriteList> favoriteList;
LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_screen);
Button b = (Button) findViewById(R.id.AddButton);
b.setOnClickListener(this);
lv = (ListView) findViewById(R.id.listview);
try
{
populateListViewFromDatabase();
} catch (Exception e)
{
Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
showsDialog(position);
}
});
}
@Override
public void onResume()
{
super.onResume();
try
{
populateListViewFromDatabase();
} catch (Exception e)
{
Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_start_screen, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.AddButton:
startActivity(new Intent(this,Form.class));
break;
default: break;
}
}
public void populateListViewFromDatabase()throws Exception
{
Find info=new Find(this);
try
{
info.open();
SimpleCursorAdapter myCursorAdapter;
myCursorAdapter = info.listUp();
lv.setAdapter(myCursorAdapter);
info.close();
} catch (SQLException e)
{
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
}
}
public void showsDialog(int pos)
{
pos++;
String s = "";
s += pos;
Intent i = new Intent(getApplicationContext(), DisplayDetails.class);
i.putExtra("position", s);
startActivity(i);
try
{
populateListViewFromDatabase();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
显示结果的新活动的类
package com.example.aakashmaroti.fillup;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.SQLException;
public class DisplayDetails extends ActionBarActivity implements View.OnClickListener
{
ImageButton ibSync;
ImageButton ibDelete;
TextView DispDetails;
int pos;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
String value="1";
if (extras != null) {
value = extras.getString("position");
}
pos=Integer.parseInt(value);
setContentView(R.layout.activity_display_details);
ibSync=(ImageButton)findViewById(R.id.imageButtonSync);
ibDelete=(ImageButton)findViewById(R.id.imageButtonDelete);
DispDetails = (TextView)findViewById(R.id.textViewDisplayDetails);
String s="";
ibSync.setOnClickListener(this);
ibDelete.setOnClickListener(this);
Find info1=new Find(this);
try
{
info1.open();
s=info1.getDetails(pos);
info1.close();
} catch (SQLException e)
{
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
}
DispDetails.setText(s);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_display_details, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings)
{
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v)
{
if(v.getId()==R.id.imageButtonSync)
{
Toast.makeText(getApplicationContext(), "This functionality has not yet been added", Toast.LENGTH_LONG).show();
}
if(v.getId()==R.id.imageButtonDelete)
{ Find info1=new Find(this);
try
{
info1.open();
info1.DeleteRow(pos);
info1.close();
} catch (SQLException e)
{
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
}
Toast.makeText(getApplicationContext(), "This record has been successfully deleted", Toast.LENGTH_LONG).show();
cancel();
}
}
public void cancel()
{
this.finish();
return;
}
}
listview中单行的Xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text=""
android:textStyle="bold"
android:clickable="true"
android:id="@+id/rowno"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text=""
android:clickable="true"
android:id="@+id/timestamp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textStyle="bold"
android:text=""
android:clickable="true"
android:id="@+id/syncdetails"/>
</LinearLayout>
任何帮助都将不胜感激
提前谢谢 只能在onResume或onCreate中获取光标。因此,尽管数据发生变化,光标仍保持不变。查看LoaderManager类。因为您要传递列表视图项的位置,所以它应该是数据库行id 改变
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
showsDialog(position);
}
但不会,因为这是数据库行id而不是列表视图位置。非常感谢!它就像一个符咒!还有没有办法显示项目位置而不是行id?因为删除行id会导致错误。再次感谢!如果您想显示listview项的位置而不是行id,那么我想您必须使用自定义适配器。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
showsDialog(position);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
TextView pos = (TextView) view.findViewById(R.id.rowno);
showsDialog(pos.getText().toString());
}
Once I delete any entry the row id on the listview doesn't seem to update the row number. (if i delete the first row, the row on top shows 2(should be 1, as it is the new first row)).