0

我正在努力解决一个奇怪的问题。我编写了一个代码来创建数据库、创建表并插入一行并使用游标检索该行。

我的问题是当我第一次运行数据库创建并且表也创建但未插入行时。所以当我开始调试控制处理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

    }

}

谁能帮我解决这个问题,因为我在过去一周对此感到震惊。

在此先感谢西瓦

4

2 回答 2

0

首先不要在数据库助手类中做任何数据库操作。其次你需要打电话

helperClass.getWritableDatabase()
//i.e.
Database.getWritableDatabase() //in your case

获取数据库的可写实例。在 Helper 类的 onCreate() 中调用 insert 很奇怪。getWritableDatabse() 返回一个实例 SQLiteDatabase。在那里执行操作。我有另一个建议为数据库创建一个解析器类或适配器类并在那里执行操作。

还有一个硬编码问题。您看到您已将 column1 声明为 INTEGER PRIMARY KEY 并且您每次都插入“1”,请删除它。

于 2013-05-20T07:19:33.527 回答
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 中,我有两个按钮,一个用于添加值,一个用于获取值

On Button 添加点击

    Log.d("Insert: ", "Inserting .."); 
    Database db= new Database(MainActivity.this);
    db.addValues(); 

On Button 获得点击

     Database db= new Database(MainActivity.this);
     db.getValues();

点击get按钮后,logact详情

     05-20 12:54:23.625: I/System.out(29225): Rows are:1 //row count     
于 2013-05-20T07:00:22.380 回答