在我的应用程序活动中运行正常,但数据库没有被创建,而且logcat中没有错误。 主要活动类:
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, "India");
cv.put(Column3, "Rupee");
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
}
}
logcat的:
05-18 12:45:22.042: I/ActivityThread(3270): Switching default density from 160 to 130
05-18 12:47:18.162: I/ActivityThread(3415): Switching default density from 160 to 130
我正在使用虚拟框进行模拟器,而在DDMS中我甚至看不到数据库是否已创建。
任何人都可以帮助我。
提前致谢 希瓦
答案 0 :(得分:2)
根据文档SqliteOpenHelper使用创建数据库的懒惰模型。这意味着,在没有数据库的情况下,onCreate将不会在构造函数中被调用,但是当实际需要数据库时,I.e。在第一次调用 getReadableDatabase 或 getWritableDatabase 时。 所以,你的情况很正常。
将SqliteOpenHelper视为数据库的连接的提供者,包含用于处理诸如“如果数据库不存在”和“如果数据库已过时”等情况的附加逻辑。 因此,在您的情况下,不要担心实际创建数据库文件的时间。
您的Activity中的数据库使用情况(如果它是唯一的,使用db)可能类似于:
private SqliteOpenHelper connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.OnCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connection = new Database(this); //no actual db creation here
//if you want to test db table creation without any further work uncomment following line
//SQLiteDatabase db = connection.getReadableDatabase();
}
public void onBtnAddRecordClick(View view) {
SqliteDatabase db = connection.getWritableDatabase(); //if something not right with
//the db this will be corrected here
ContentValues values;
//... fill in the record to insert
db.insert(MY_TABLE_NAME, null, values);
}
重要说明:如果要从多个活动访问数据库,请考虑使数据库将SqliteDatabaseHelper扩展为单例或将其包装到ContentProvider中,因为通常不赞成使用多个连接没有明确目的的数据库。
答案 1 :(得分:0)
我猜db.insert(r_Table, null, cv);
错了。第一个参数r_Table
应为Tablename
。
答案 2 :(得分:0)
更改行
final String r_Table = "CREATE TABLE " + Tablename + " (" + Column1+ " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text) ";
到
final String r_Table = "CREATE TABLE " + Tablename + " (" + Column1+ " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text);";