Android 在运行时创建SQlite数据库
我试图在运行时创建多个数据库。用户输入数据库名称,系统必须创建它 这是我的密码 首先是JavaAndroid 在运行时创建SQlite数据库,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我试图在运行时创建多个数据库。用户输入数据库名称,系统必须创建它 这是我的密码 首先是Java public class First extends Activity implements OnClickListener { Button btnOk; EditText inputName; DatabaseHandler db = null; @Override public void onCr
public class First extends Activity implements OnClickListener {
Button btnOk;
EditText inputName;
DatabaseHandler db = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.db);
try {
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
initVar();
}
catch (Exception e) {
CommonUtils.postException(e, e.getMessage().toString());
}
}
private void initVar() {
try {
btnOk = (Button) findViewById(R.id.btnOk);
inputName = (EditText) findViewById(R.id.dbName);
btnOk.setOnClickListener(this);
}
catch (Exception e) {
CommonUtils.postException(e, e.getMessage().toString());
}
}
public void onClick(View v) {
if (v == btnOk ){
DBConstants.DATABASE_NAME=inputName.getText().toString().trim();
Toast.makeText(getApplicationContext(), DBConstants.DATABASE_NAME, Toast.LENGTH_LONG).show();
db = new DatabaseHandler(getApplicationContext());
db.getmyDb();
if(DatabaseHandler.doesDatabaseExist(getApplication(), inputName.getText().toString().trim())== true ){
Toast.makeText(getApplicationContext(), "DB created", Toast.LENGTH_LONG).show();
db.close();
}else{
Toast.makeText(getApplicationContext(), "DB Not created", Toast.LENGTH_LONG).show();
db.close();
}
}
}
}
DatabaseHandler.java
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static SQLiteDatabase myDb = null;
public DatabaseHandler(Context context) {
super(context, DBConstants.DATABASE_NAME, null, DATABASE_VERSION);
}
public SQLiteDatabase getmyDb() {
if (myDb == null)
myDb = this.getWritableDatabase();
return myDb;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
public static boolean doesDatabaseExist(ContextWrapper context, String dbName) {
File dbFile=context.getDatabasePath(dbName);
return dbFile.exists();
}
按下OK按钮,我需要用用户在EditText中输入的文本创建一个数据库
目前这只工作一次,如果用户第二次输入不同的文本,则不会创建数据库我怀疑它正在创建您的数据库。当您检查它是否已创建时,您只是弄错了 onClick方法中的这一行:
db.getmyDb();
将始终返回第一个数据库,因为它调用:
public SQLiteDatabase getmyDb() {
if (myDb == null)
myDb = this.getWritableDatabase();
return myDb;
}
它在第一次调用时,将myDb设置为第一个数据库,从那时起,始终返回该值
您需要设置数据库索引,并在数组中跟踪数据库。public void createDynamicDatabase(上下文上下文、字符串表名、数组列表标题){
public void createDynamicDatabase(Context context, String tableName, ArrayList<String> title) {
Log.i("INSIDE createLoginDatabase() Method","*************creatLoginDatabase*********");
try {
int i;
String queryString;
myDataBase = context.openOrCreateDatabase("Db", Context.MODE_WORLD_WRITEABLE, null); //Opens database in writable mode.
//System.out.println("Table Name : "+tableName.get(0));
queryString = title.get(0)+" VARCHAR(30),";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1; i < title.size() - 1; i++)
{
queryString += title.get(i);
queryString +=" VARCHAR(30)";
queryString +=",";
}
queryString+= title.get(i) +" VARCHAR(30)";
queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "("+queryString+");";
System.out.println("Create Table Stmt : "+ queryString);
myDataBase.execSQL(queryString);
} catch (SQLException ex) {
Log.i("CreateDB Exception ",ex.getMessage());
}
}
public void insert(Context context, ArrayList<String> array_vals, ArrayList<String> title, String TABLE_NAME) {
Log.d("Inside Insert","Insertion starts for table name: "+TABLE_NAME);
myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null); //Opens database in writable mode.
String titleString = null;
String markString = null;
int i;
titleString = title.get(0)+",";
markString = "?,";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1; i < title.size() - 1; i++)
{
titleString += title.get(i);
titleString +=",";
markString += "?,";
}
titleString+= title.get(i);
markString += "?";
//System.out.println("Title String: "+titleString);
//System.out.println("Mark String: "+markString);
INSERT="insert into "+ TABLE_NAME + "("+titleString+")"+ "values" +"("+markString+")";
System.out.println("Insert statement: "+INSERT);
//System.out.println("Array size iiiiii::: "+array_vals.size());
//this.insertStmt = this.myDataBase.compileStatement(INSERT);
int s=0;
while(s<array_vals.size()) {
System.out.println("Size of array1"+array_vals.size());
// System.out.println("Size of array"+title.size());
int j=1;
this.insertStmt = this.myDataBase.compileStatement(INSERT);
for(int k =0;k< title.size();k++)
{
//System.out.println("Value of column "+title+" is "+array_vals.get(k+s));
//System.out.println("PRINT S:"+array_vals.get(k+s));
System.out.println("BindString: insertStmt.bindString("+j+","+ array_vals.get(k+s)+")");
insertStmt.bindString(j, array_vals.get(k+s));
j++;
}
s+=title.size();
}
insertStmt.executeInsert();
}
Log.i(“内部createLoginDatabase()方法”,“****************createLoginDatabase**********”;
试一试{
int i;
串查询串;
myDataBase=context.openOrCreateDatabase(“Db”,context.MODE_WORLD_WRITEABLE,null);//以可写模式打开数据库。
//System.out.println(“表名:”+tableName.get(0));
queryString=title.get(0)+“VARCHAR(30)”;
Log.d(“**createDynamicDatabase”,“在oncreate中”);
对于(i=1;i
private static SQLiteDatabase myDb = null;
尝试删除静态修饰符-该字段用作实例对象。我可以看到数据库没有创建…检查数据库是否存在的代码可能是错误的,谢谢您的建议it@HalR你能给我一些关于Sqlite的建议吗?那就是我想像所有其他聊天应用一样存储我的聊天应用的消息,我怎么能实现这一点。我尝试了这段代码,但出现了syntex错误。我的疑问是1.如何在运行时创建数据库和表,2.如何在运行时插入数据。@devendrasing这个问题可能会对您有所帮助。它正在创建db,但在这一行插入数据时出现了syntex错误this.insertStmt=this.myDataBase.compileStatement(插入);