我正在努力解决一个奇怪的问题。我编写了一个代码来创建数据库,创建表并插入一行并使用游标来回溯行。
我的问题是,当我第一次运行数据库得到创建和表也已创建但未插入行。所以当我开始调试控件处理 getWritabledatabase 时,我尝试调试应用程序,并且它不会移动到Oncreate。以下是我的代码。
主要活动:
package com.example.testdb;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Database d=new Database(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
数据库类
package com.example.testdb;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class Database extends SQLiteOpenHelper{
String Tablename = "Table1";
private String Column1 = "RegionID";
private String Column2 = "RegionName";
private String Column3 = "Currency";
SQLiteDatabase db;
public Database(Context context) {
super(context, "Test", null, 2);
this.getWritableDatabase();
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
try{
final String r_Table = "CREATE TABLE " + Tablename + " (" + Column1+ " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text) ";
db.execSQL(r_Table);
ContentValues cv=new ContentValues();
cv.put(Column1, 1);
cv.put(Column2, "US");
cv.put(Column3, "Dollar");
db.insert(r_Table, null, cv);
}
catch(Exception e){
System.out.println(e.getMessage());
}
Cursor c=db.rawQuery("Select * from Table1", null);
if (c != null ) {
if (c.moveToFirst()) {
//Toast.makeText(new MainActivity().getApplicationContext(), c.getCount(), Toast.LENGTH_LONG).show();
System.out.println("Rows are:"+c.getCount());
}
}
c.close();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
任何人都可以帮助我解决这个问题,因为我在过去一周内对此感到震惊。
提前致谢 希瓦
答案 0 :(得分:0)
我对您的代码进行了一些更改,并在我的设备上进行了相同的测试。以下作品。我猜你得到了NullPointerException。下次包含logcat跟踪会更好。您可以使用以下内容作为参考。
public class Database extends SQLiteOpenHelper{
String Tablename = "Table1";
private String Column1 = "RegionID";
private String Column2 = "RegionName";
private String Column3 = "Currency";
public Database(Context context) {
super(context, "Test", null, 2);
this.getWritableDatabase();
// TODO Auto-generated constructor stub
}
public void addValues()
{ SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(Column2, "US");
cv.put(Column3, "Dollar");
db.insert(Tablename,null , cv);
}
public void getValues()
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor c=db.rawQuery("Select * from Table1", null);
if (c != null ) {
if (c.moveToFirst()) {
System.out.println("Rows are:"+c.getCount());
}
}
c.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + Tablename + "("
+ Column1 + " INTEGER PRIMARY KEY," + Column2 + " TEXT,"
+ Column3 + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
在MainActiivty中,我有两个按钮用于添加值,一个用于获取值
在按钮上添加点击
Log.d("Insert: ", "Inserting ..");
Database db= new Database(MainActivity.this);
db.addValues();
按钮点击
Database db= new Database(MainActivity.this);
db.getValues();
单击“获取”按钮后,会显示详细信息
05-20 12:54:23.625: I/System.out(29225): Rows are:1 //row count
答案 1 :(得分:0)
首先,不要在数据库助手类中执行任何数据库操作。其次你需要打电话
helperClass.getWritableDatabase()
//i.e.
Database.getWritableDatabase() //in your case
获取数据库的可写实例。在Helper类的onCreate()中调用insert非常奇怪。 getWritableDatabse()返回一个实例SQLiteDatabase。在那里执行操作。我有另一个建议为数据库创建一个解析器类或适配器类并在那里执行操作。
还有一个硬编码问题。您看到已将column1声明为INTEGER PRIMARY KEY,并且每次都插入“1”,请将其删除。