i我试图将目标日期添加到listGditem,目标权重到listGwitem和当前的重量为listCwitem,然后将它们插入SQLITE,并将其显示在Historical Activity.java中。将数据插入设置行为有效,但是显示这些项目的显示以下错误:
引起的: 来自Cursorwindow。确保正确初始化光标 从中访问数据之前。 在android.database.cursorwindow.nativegetstring(本机方法( at android.database.cursorwindow.getstring(cursorwindow.java:438( at Android.database.AbstractwindowedCursor.getString(AbstractWindowedCursor.java:51(
在com.example.fftest.thistoryactivity.viewdata(historyActivity.java:121(
在com.example.fftest.thistoryactivity.oncreate(historyActivity.java:85(
历史法
public class historyActivity extends MainActivity {
private TextView mTextMessage;
Intent intent = new Intent();
ListView listView1;
ListView listView2;
ListView listView3;
ArrayList<String> listgDitem;
ArrayList<String> listgWitem;
ArrayList<String> listcWitem;
Cursor cursor;
EditText goalDinput;
EditText goalWinput;
EditText currentWinput;
DatabaseHelper myDB;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
mTextMessage.setText(R.string.title_home);
Intent intent1 = new Intent(historyActivity.this, MainActivity.class);
startActivity(intent1);
break;
case R.id.navigation_history:
mTextMessage.setText(R.string.title_history);
Intent intent2 = new Intent(historyActivity.this, historyActivity.class);
startActivity(intent2);
break;
case R.id.navigation_progress:
mTextMessage.setText(R.string.title_progress);
Intent intent3 = new Intent(historyActivity.this, progressActivity.class);
startActivity(intent3);
break;
case R.id.navigation_settings:
mTextMessage.setText(R.string.title_settings);
Intent intent4 = new Intent(historyActivity.this, settingsActivity.class);
startActivity(intent4);
break;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
goalDinput = findViewById(R.id.goaldinput);
goalWinput = findViewById(R.id.goalwinput);
currentWinput = findViewById(R.id.currentWinput);
listView1=findViewById(R.id.goaldlistView);
listView2=findViewById(R.id.goalwlistView);
listView3=findViewById(R.id.currentwlistView);
viewData();
listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String text = listView1.getItemAtPosition(i).toString();
Toast.makeText(historyActivity.this,"" + text, Toast.LENGTH_SHORT).show();
}
});
listView2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String text = listView2.getItemAtPosition(i).toString();
Toast.makeText(historyActivity.this,"" + text, Toast.LENGTH_SHORT).show();
}
});
listView3.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String text = listView3.getItemAtPosition(i).toString();
Toast.makeText(historyActivity.this,"" + text, Toast.LENGTH_SHORT).show();
}
});
}
private void viewData() {
myDB = new DatabaseHelper(this);
listgDitem=new ArrayList<>();
listgWitem=new ArrayList<>();
listcWitem=new ArrayList<>();
cursor = myDB.viewData();
if (cursor.getCount() == 0) {
Toast.makeText(this, "No data to show", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
listgDitem.add(cursor.getString(1));
listgWitem.add(cursor.getString(2));
listcWitem.add(cursor.getString(3));
}
adapter1 = new ArrayAdapter<>(this, R.layout.activity_history, listgDitem);
adapter2 = new ArrayAdapter<>(this, R.layout.activity_history, listgWitem);
adapter3 = new ArrayAdapter<>(this, R.layout.activity_history, listcWitem);
listView1.setAdapter(adapter1);
listView2.setAdapter(adapter2);
listView3.setAdapter(adapter3);
}
}
}
databasehelper.java
package com.example.fftest;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DB_NAME="weightDB.db";
public static final String DB_TABLE="weightDB_data";
public static final String ID = "ID";
public static final String Col1 = "GDATE";
public static final String Col2 = "GWEIGHT";
public static final String Col3 = "CWEIGHT";
public static final String CREATE_TABLE="CREATE TABLE " + DB_TABLE + " ("+
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
" GDATE TEXT, GWEIGHT TEXT, CWEIGHT " + ") ";
Cursor cursor;
public DatabaseHelper(Context ctx)
{
super(ctx, DB_NAME, null, 1);}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_TABLE);}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("DROP IF TABLE EXISTS " + DB_TABLE);
onCreate(db);
}
public boolean insertData(String gDate, String gWeight, String cWeight){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(Col1, gDate);
contentValues.put(Col2, gWeight);
contentValues.put(Col3, cWeight);
long result = db.insert(DB_TABLE, null, contentValues);
return result !=-1;
}
public Cursor viewData(){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * from " + DB_TABLE;
cursor = db.rawQuery(query,null);
return cursor;
}
}
我可以看到的三件事是您的代码中的可疑/错误,
1.如果您最近更改了CREATE_TABLE
模式,则必须在DatabaseHelper.java
static final int DB_VERSION = 2;
public DatabaseHelper(Context ctx) {
super(ctx, DB_NAME, null, DB_VERSION);
}
2.完整的create_table架构找到,最后一部分, CWEIGHT
type TEXT
in the CREATE_TABLE
中错过了。
public static final String CREATE_TABLE="CREATE TABLE " + DB_TABLE + " ("+
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
" GDATE TEXT, GWEIGHT TEXT, CWEIGHT " + ") ";
正确的是
public static final String CREATE_TABLE="CREATE TABLE " + DB_TABLE + " ("+
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
" GDATE TEXT, GWEIGHT TEXT, CWEIGHT TEXT" + "); ";
3. Onupgrade((方法,带有错误的架构,"如果"位置,
db.execSQL("DROP IF TABLE EXISTS " + DB_TABLE);
这可能会丢下以下错误,
android.database.sqlite.SQLiteException: near "IF": syntax error
正确的语法为drop表[如果存在] [schema_name。] table_name;因此,您可以更新代码,
db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);