2011-11-22 75 views
0

首先我创建了一个表,它工作。第二个我以同样的方式做到了,仍然给出了错误:没有这样的表my_contacts。未创建Android第二张表

所以这是代码:

[在主要活动]

DBOperations.insert(this, TABLE_MY_CONTACTS, fields, vals); 

凡DBOperations类看起来是这样的:

public class DBOperations implements Tables { 

// inserting 1 contact into a table 
public static boolean insert (Context context, String table, ArrayList <String> fields, ArrayList <String> vals) { 

    if (fields.size() != vals.size()) 
     return false; 

    MySQLite_methods mysql = new MySQLite_methods (context, table); // creates the table!!!!!!!!! 
    ContentValues values = new ContentValues(); 

    for (int i=0; i<fields.size(); i++) 
     values.put(fields.get(i), vals.get(i)); 

    // checking if the card for that ulink already existed (if so, overwrite) 
    String[] COLUMNS = {ULINK}; 
    SQLiteDatabase dbr = mysql.getReadableDatabase(); 
    Cursor cursor = dbr.query(table, COLUMNS, null, null, null, null, null); 

    SQLiteDatabase dbw = mysql.getWritableDatabase(); 
    if (cursor == null || cursor.moveToFirst() == false)     
     dbw.insertOrThrow(table, null, values); 
    else 
     if (cursor.moveToFirst()) { 
      String value_ulink = cursor.getString(0); 
      Log.d("geo", "val="+value_ulink); 
      dbw.update(table, values, ULINK+"='"+value_ulink+"'", null); 
     } 

    return true; 
} 

    // .... 
} 

MySQLite_methods类扩展SQLiteOpenHelper,看起来像这样:

public class MySQLite_methods extends SQLiteOpen助手实现表{

private static final String DATABASE_NAME = "my_database.db" ; 
private static final int DATABASE_VERSION = 1; 
private String TABLE_NAME; 

/** Create a helper object for the Events database */ 
public MySQLite_methods (Context ctx, String table_name) 
{ 
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION); 
    this.TABLE_NAME = table_name; 
} 

@Override 
public void onCreate(SQLiteDatabase db) 
{  
    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + 
        " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +    
        NAME + " TEXT NOT NULL," + 
        PHONE + " TEXT NOT NULL,"+ 
        EMAIL + " TEXT NOT NULL,"+      
        FACEBOOK + " TEXT,"+ 
        WEBSITE + " TEXT,"+ 
        MAJOR + " TEXT NOT NULL,"+ 
        ULINK + " TEXT NOT NULL" + ");" ; 

    Log.d("geo", sql); 

    db.execSQL(sql); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(db); 
} 

}

最后的接口表如下所示:

public interface Tables extends BaseColumns { 

/* 
* From the BaseColumns interface we inherit the constants: 
* _ID - The unique ID for a row. 
* _COUNT - The count of rows in a directory. 
*/ 

//tables name 
public static final String TABLE_MY_CARD= "my_card" ; 
public static final String TABLE_MY_CONTACTS = "my_contacts" ; 

// Columns 
public static final String NAME = "name" ; 
public static final String PHONE = "phone" ; 
public static final String EMAIL = "email"; 

public static final String FACEBOOK = "facebook"; 
public static final String WEBSITE = "web"; 
public static final String MAJOR = "major"; 
public static final String ULINK = "ulink"; 

} 

随着我确实创造了另一个表这是成功的相同的步骤。但是这个我根本无法创造!

+0

为什么你动态创建表?试试这个教程:http://www.devx.com/wireless/Article/40842 –

回答

2

我认为onUpgrade和onCreate没有按照你认为的方式执行。

仅当需要创建数据库文件时才会执行onCreate。在执行必要

onUpgrade(即NEWVERSION> oldVersion)

我相信所发生的事情是,第一个表被创建,因为执行的onCreate,因为数据库尚不存在。然后,当您尝试创建第二个表时,它不起作用,因为onCreate或onUpgrade都不会被调用。

您应该在onCreate期间创建所有表并处理onUpgrade期间所需的任何升级逻辑。

+0

我也是这么认为的!所以我在onCreate函数中预先创建了两个表格,以确保两者都将被创建并运行。 – Madrugada