无法在数据库中创建多个表

时间:2013-08-26 06:57:35

标签: android database sqlite

我必须在数据库中创建3个表。因此,我定义表的列和行并执行SQLite命令。但是,当我尝试向表中添加一些值时,它会给我一个运行时错误。与此相反,当我只创建一个特定的表并在运行时向其添加值时,事情似乎正常。下面是数据库创建类:

public class StockDatabase extends SQLiteOpenHelper{


public static final String DATABASE_NAME="Accountancy";

public static final int DATABASE_VERSION=7;

public static String createPurchaseTable= "CREATE TABLE stock (_id INTEGER PRIMARY KEY AUTOINCREMENT, item_name TEXT NOT NULL, quant INTEGER NOT NULL, Prate REAl NOT NULL, Srate REAL NOT NULL);";
public static String createSaleTable="CREATE TABLE i/o_register (_id INTEGER PRIMARY KEY AUTOINCREMENT, item_code INTEGER NOT NULL, quantity INTEGER NOT NULL, rate REAL NOT NULL);";
public static String createRegister="CREATE TABLE s/p_register (PartyName TEXT NOT NULL, range TEXT NOT NULL, date TEXT NOT NULL, type INTEGER NOT NULL);";


public StockDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    // TODO Auto-generated constructor stub

}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(createPurchaseTable);
    db.execSQL(createSaleTable);
    db.execSQL(createRegister);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS stock");
    db.execSQL("DROP TABLE IF EXISTS i/o_register");
    db.execSQL("DROP TABLE IF EXISTS s/p_register");
    onCreate(db);
    }

   }

CASE:当只在数据库中创建'stock'表时。 当我尝试在'stock'表中添加一些值时,一切都很完美。

CASE:在数据库中创建3个表时 我尝试在stock表中添加值,但它给了我一个nullPointerException。

4 个答案:

答案 0 :(得分:0)

尝试在更改DATABASE_VERSION(即数据库中当前为7)后创建新表。

修改

现在尝试以这种方式创建一个表:

 public class DatabaseManager {
// the Activity or Application that is creating an object from this class.
Context context;

// a reference to the database used by this application/object
private SQLiteDatabase db;

// These constants are specific to the database. They should be
// changed to suit your needs.
private final String DB_NAME = "database_name_2";
private final int DB_VERSION = 8;

// These constants are specific to the database table. They should be
// changed to suit your needs.
private final String TABLE_NAME = "database_table";
private final String TABLE_ROW_ID = "id";
private final String TABLE_ROW_ONE = "table_row_one";
private final String TABLE_ROW_TWO = "table_row_two";
private final String TABLE_ROW_THREE = "table_row_three";

public DatabaseManager(Context context) {
    this.context = context;

    // create or open the database
    CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context);
    this.db = helper.getWritableDatabase();

}

/**********************************************************************
 * ADDING A ROW TO THE DATABASE TABLE
 * 
 * This is an example of how to add a row to a database table using this
 * class. You should edit this method to suit your needs.
 * 
 * the key is automatically assigned by the database
 * 
 * @param rowStringOne
 *            the value for the row's first column
 * @param rowStringTwo
 *            the value for the row's second column
 */
public void addRow(String rowStringOne, String rowStringTwo, String qty) {
    // this is a key value pair holder used by android's SQLite functions
    ContentValues values = new ContentValues();
    values.put(TABLE_ROW_ONE, rowStringOne);
    values.put(TABLE_ROW_TWO, rowStringTwo);
    values.put(TABLE_ROW_THREE, qty);

    // ask the database object to insert the new data
    try {
        db.insert(TABLE_NAME, null, values);
    } catch (Exception e) {
        Log.e("DB ERROR", e.toString());
        e.printStackTrace();
    }
}

/**********************************************************************
 * DELETING A ROW FROM THE DATABASE TABLE
 * 
 * This is an example of how to delete a row from a database table using
 * this class. In most cases, this method probably does not need to be
 * rewritten.
 * 
 * @param rowID
 *            the SQLite database identifier for the row to delete.
 */
public void deleteRow(long rowID) {
    // ask the database manager to delete the row of given id
    try {
        db.delete(TABLE_NAME, TABLE_ROW_ID + "=" + rowID, null);
    } catch (Exception e) {
        Log.e("DB ERROR", e.toString());
        e.printStackTrace();
    }
}

/**********************************************************************
 * UPDATING A ROW IN THE DATABASE TABLE
 * 
 * This is an example of how to update a row in the database table using
 * this class. You should edit this method to suit your needs.
 * 
 * @param rowID
 *            the SQLite database identifier for the row to update.
 * @param rowStringOne
 *            the new value for the row's first column
 * @param rowStringTwo
 *            the new value for the row's second column
 */
public void updateRow(long rowID, String rowStringOne, String rowStringTwo,
        String qty) {
    // this is a key value pair holder used by android's SQLite functions
    ContentValues values = new ContentValues();
    values.put(TABLE_ROW_ONE, rowStringOne);
    values.put(TABLE_ROW_TWO, rowStringTwo);
    values.put(TABLE_ROW_THREE, qty);

    // ask the database object to update the database row of given rowID
    try {
        db.update(TABLE_NAME, values, TABLE_ROW_ID + "=" + rowID, null);
    } catch (Exception e) {
        Log.e("DB Error", e.toString());
        e.printStackTrace();
    }
}

/**********************************************************************
 * RETRIEVING A ROW FROM THE DATABASE TABLE
 * 
 * This is an example of how to retrieve a row from a database table using
 * this class. You should edit this method to suit your needs.
 * 
 * @param rowID
 *            the id of the row to retrieve
 * @return an array containing the data from the row
 */
public ArrayList<Object> getRowAsArray(long rowID) {
    // create an array list to store data from the database row.
    // I would recommend creating a JavaBean compliant object
    // to store this data instead. That way you can ensure
    // data types are correct.
    ArrayList<Object> rowArray = new ArrayList<Object>();
    Cursor cursor;

    try {
        // this is a database call that creates a "cursor" object.
        // the cursor object store the information collected from the
        // database and is used to iterate through the data.
        cursor = db.query(TABLE_NAME, new String[] { TABLE_ROW_ID,
                TABLE_ROW_ONE, TABLE_ROW_TWO, TABLE_ROW_THREE },
                TABLE_ROW_ID + "=" + rowID, null, null, null, null, null);

        // move the pointer to position zero in the cursor.
        cursor.moveToFirst();

        // if there is data available after the cursor's pointer, add
        // it to the ArrayList that will be returned by the method.
        if (!cursor.isAfterLast()) {
            do {
                rowArray.add(cursor.getLong(0));
                rowArray.add(cursor.getString(1));
                rowArray.add(cursor.getString(2));
                rowArray.add(cursor.getString(3));
            } while (cursor.moveToNext());
        }

        // let java know that you are through with the cursor.
        cursor.close();
    } catch (SQLException e) {
        Log.e("DB ERROR", e.toString());
        e.printStackTrace();
    }

    // return the ArrayList containing the given row from the database.
    return rowArray;
}

/**********************************************************************
 * RETRIEVING ALL ROWS FROM THE DATABASE TABLE
 * 
 * This is an example of how to retrieve all data from a database table
 * using this class. You should edit this method to suit your needs.
 * 
 * the key is automatically assigned by the database
 */

public ArrayList<ArrayList<Object>> getAllRowsAsArrays() {
    // create an ArrayList that will hold all of the data collected from
    // the database.
    ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();

    // this is a database call that creates a "cursor" object.
    // the cursor object store the information collected from the
    // database and is used to iterate through the data.
    Cursor cursor;

    try {
        // ask the database object to create the cursor.
        cursor = db.query(TABLE_NAME, new String[] { TABLE_ROW_ID,
                TABLE_ROW_ONE, TABLE_ROW_TWO, TABLE_ROW_THREE }, null,
                null, null, null, null);

        // move the cursor's pointer to position zero.
        cursor.moveToFirst();

        // if there is data after the current cursor position, add it
        // to the ArrayList.
        if (!cursor.isAfterLast()) {
            do {
                ArrayList<Object> dataList = new ArrayList<Object>();

                dataList.add(cursor.getLong(0));
                dataList.add(cursor.getString(1));
                dataList.add(cursor.getString(2));
                dataList.add(cursor.getString(3));

                dataArrays.add(dataList);
            }
            // move the cursor's pointer up one position.
            while (cursor.moveToNext());
        }
    } catch (SQLException e) {
        Log.e("DB Error", e.toString());
        e.printStackTrace();
    }

    // return the ArrayList that holds the data collected from
    // the database.
    return dataArrays;
}

/**********************************************************************
 * THIS IS THE BEGINNING OF THE INTERNAL SQLiteOpenHelper SUBCLASS.
 * 
 * I MADE THIS CLASS INTERNAL SO I CAN COPY A SINGLE FILE TO NEW APPS AND
 * MODIFYING IT - ACHIEVING DATABASE FUNCTIONALITY. ALSO, THIS WAY I DO NOT
 * HAVE TO SHARE CONSTANTS BETWEEN TWO FILES AND CAN INSTEAD MAKE THEM
 * PRIVATE AND/OR NON-STATIC. HOWEVER, I THINK THE INDUSTRY STANDARD IS TO
 * KEEP THIS CLASS IN A SEPARATE FILE.
 *********************************************************************/

/**
 * This class is designed to check if there is a database that currently
 * exists for the given program. If the database does not exist, it creates
 * one. After the class ensures that the database exists, this class will
 * open the database for use. Most of this functionality will be handled by
 * the SQLiteOpenHelper parent class. The purpose of extending this class is
 * to tell the class how to create (or update) the database.
 * 
 * @author Randall Mitchell
 * 
 */
private class CustomSQLiteOpenHelper extends SQLiteOpenHelper {
    public CustomSQLiteOpenHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // This string is used to create the database. It should
        // be changed to suit your needs.
        String newTableQueryString = "create table " + TABLE_NAME + " ("
                + TABLE_ROW_ID
                + " integer primary key autoincrement not null,"
                + TABLE_ROW_ONE + " text," + TABLE_ROW_TWO + " text"
                + TABLE_ROW_THREE + " text" + ");";

        // execute the query string to the database.
        db.execSQL(newTableQueryString);

        String newTableQueryString2 = "alter table " + TABLE_NAME
                + " ADD COLUMN " + TABLE_ROW_THREE + " text";
        // execute the query string to the database.
        db.execSQL(newTableQueryString2);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // NOTHING TO DO HERE. THIS IS THE ORIGINAL DATABASE VERSION.
        // OTHERWISE, YOU WOULD SPECIFIY HOW TO UPGRADE THE DATABASE.
    }
}
  }

答案 1 :(得分:0)

Karan我相信你提供的表名i / o_register创建问题只是更改表名并且不在表名中包含'/'然后一切都会正常工作。 您的创建查询也没有在Sqlite for Windows上运行。

答案 2 :(得分:0)

从表名中删除/,或者将表名始终放在反引号中:

sqlite> create table foo/bar(baz);
Error: near "/": syntax error
sqlite> create table `foo/bar`(baz);
sqlite>

答案 3 :(得分:0)

增加db版本。永远有效。