gpt4 book ai didi

java - sqlite 行 ID 与 ListView 不匹配 - ANDROID

转载 作者:行者123 更新时间:2023-11-30 02:26:30 24 4
gpt4 key购买 nike

这可能是一个蹩脚的问题,但我是初学者,似乎不了解我的应用程序的行为。

我有一个 SQLite 数据库,在主要 Activity 中有一个 ListView 。在 ListView 中,我显示列表编号(行 ID)和其他详细信息。在按下列表项时,会打开一个新 Activity ,它会在 TextView 中显示详细信息,并有 2 个用于删除和同步的图像按钮。

在我删除任何条目之前,该应用程序运行良好。

一旦我删除任何条目, ListView 上的行 ID 似乎不会更新行号。 (如果我删除第一行,顶部的行显示 2(应该是 1,因为它是新的第一行))。

但是,当我显示记录的详细信息时,结果是正确的。 (列表中的第二项显示行号 2)

此外,当我按下 ListView 中的一个项目时,其位置与我之前删除的位置相同,应用程序崩溃(假设我删除了第一个条目,之后每当我单击 ListView 上的第一个项目时显示它应用程序崩溃)

应用程序崩溃时出现错误:

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

我的主要 Activity

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();
}
}

}

sqlite数据库管理类

package com.example.aakashmaroti.fillup;

import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.View;
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;

/**
* Created by Aakash Maroti on 28-Dec-14.
*/
public class Find
{
public static final String KEY_ROWID = "_id";
public static final String KEY_TIMESTAMP= "time_stamp";
public static final String KEY_IS_SYNCED = "sync";
public static final String KEY_NameOfCompany="name_of_company";



private static final String DATABASE_NAME = "FillUpFormsDB";
private static final String DATABASE_TABLE = "FillUpFormsTable";
private static final int DATABASE_VERSION = 1;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;




private static class DbHelper extends SQLiteOpenHelper
{

public DbHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}



@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_IS_SYNCED +" TEXT NOT NULL, " +
KEY_TIMESTAMP +" TEXT NOT NULL, " +
KEY_NameOfCompany+" TEXT NOT NULL);"
);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}

}


public Find(Context c)
{
ourContext = c;
}

public Find open()throws SQLException
{
ourHelper = new DbHelper(ourContext);
ourDatabase=ourHelper.getWritableDatabase();
return this;
}

public void close()
{
ourHelper.close();
}


public long createEntry(String isSynced, String timeStamp, String nameOfCompany)
{
ContentValues cv=new ContentValues();
cv.put(KEY_IS_SYNCED,isSynced);
cv.put(KEY_TIMESTAMP,timeStamp);
cv.put(KEY_NameOfCompany,nameOfCompany);

return ourDatabase.insert(DATABASE_TABLE,null,cv);

}

public SimpleCursorAdapter listUp()
{

String columns[]=new String[]{KEY_ROWID,KEY_TIMESTAMP,KEY_IS_SYNCED};
Cursor c= ourDatabase.query(DATABASE_TABLE,columns,null,null,null,null,null);
int toViewIDs[] = new int[]{R.id.rowno,R.id.timestamp,R.id.syncdetails};
SimpleCursorAdapter CursorAdapter;
CursorAdapter = new SimpleCursorAdapter(ourContext,R.layout.design_row,c,columns,toViewIDs,0);
return CursorAdapter;
}

public String getDetails(long row)
{
String columns[]=new String[] {KEY_ROWID, KEY_IS_SYNCED, KEY_TIMESTAMP,KEY_NameOfCompany};
String result="";
Cursor c= ourDatabase.query(DATABASE_TABLE,columns,KEY_ROWID+"="+row,null,null,null,null);
if(c!=null)
{
String r;
c.moveToFirst();
r="\nRecord No. : "+c.getString(0)+"\n\nSync Status:"+c.getString(1)+"\n\nTime of Creation:\n"+c.getString(2)+"\n\nName of Company:\n"+c.getString(3);
return r;
}

return result;
}

public void DeleteRow(int pos)
{
ourDatabase.delete(DATABASE_TABLE,KEY_ROWID+"="+pos,null);
}
}

显示结果的新 Activity 的类。

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>

任何帮助将不胜感激。

提前致谢。

最佳答案

这是因为你传递的是 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)).

但它不会,因为这是数据库行 ID 而不是 ListView 位置。

关于java - sqlite 行 ID 与 ListView 不匹配 - ANDROID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com