无法创建Sqlite数据库

时间:2013-06-04 05:27:06

标签: android sqlite

我为数据库制作了简单的类,但是当我在真实设备上测试时,应用程序关闭了!

public class MySQLiteHelper extends SQLiteOpenHelper 
{
    public static final String TABLE_NAME = "caffe";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_ARTIKAL = "artikal";
    public static final String COLUMN_PRICE = "price";
    public static final String COLUMN_AMOUNT = "amount";
    //public static final String COLUMN_TIME = "date&time";


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


    private static final String DATABASE_CREATE = "create table " + TABLE_NAME + "(" + COLUMN_ID+ " integer primary key autoincrement," +COLUMN_ARTIKAL  + " text not null"+ COLUMN_PRICE + " real not null"+ COLUMN_AMOUNT+" integer not null);";

    public MySQLiteHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) 
    {
        database.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        Log.w(MySQLiteHelper.class.getName(),
        "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

class DataAccessObject:

public class BD_DAO 
{
    private SQLiteDatabase database;
    private MySQLiteHelper dbHelper;
    private String[] allColumns = {MySQLiteHelper.COLUMN_ARTIKAL,MySQLiteHelper.COLUMN_PRICE, MySQLiteHelper.COLUMN_AMOUNT};

    public BD_DAO(Context context) 
    {
        dbHelper = new MySQLiteHelper(context);
    }

    public void open() throws SQLException 
    {
        database = dbHelper.getWritableDatabase();
    }

    public void close()
    {
        dbHelper.close();
    }

    public void createItem(Item item) 
    {
        ContentValues values = new ContentValues();
        values.put(MySQLiteHelper.COLUMN_ARTIKAL, item.getArtikal().toString());
        values.put(MySQLiteHelper.COLUMN_PRICE, Double.toString(item.getPrice()).toString());
        values.put(MySQLiteHelper.COLUMN_AMOUNT, Integer.toString(item.getAmount()).toString());
        database.insert(MySQLiteHelper.TABLE_NAME, null,values);
    }

    public List<Item> getAllItems() 
    {
        List<Item> items = new ArrayList<Item>();
        Cursor cursor = database.query(MySQLiteHelper.TABLE_NAME, allColumns, null, null, null, null, null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast())
        {
            Item cursorItem = cursorToItem(cursor);
            items.add(cursorItem);
            cursor.moveToNext();
        }
        cursor.close();
        return items;
    }

    private Item cursorToItem(Cursor cursor) 
    {
        Item item = new Item();
        item.setArtikal(cursor.getString(1));
        item.setPrice(cursor.getDouble(2));
        item.setAmount(cursor.getInt(3));
        return item;
    }
}

主要课程:

......listview, some buttons......
Button DB=(Button)findViewById(R.id.DB);
DB.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v) 
    {
        databasesource.open();
        /*for (Item s:tableList)
        {
            databasesource.createItem(s);}*/
            databasesource.close();
            adapter.clear();
    }
});

应用程序工作正常,直到我按下按钮,然后只是大声喊叫。首先我尝试在db中发送一些数据,关闭应用程序,然后我尝试创建db,但又关闭了!我应该做一些更改是android清单还是其他一些.xml?

提前致谢!!

如何放入logcat?

3 个答案:

答案 0 :(得分:2)

尝试这种方式。

DB.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {

        BD_DAO db = new BD_DAO(getApplicationContext());
        //make your CRUD operation and then close database object
        db.close();

    }
});

使用现有代码重播此代码。

 private static final String DATABASE_CREATE = "create table " +
            TABLE_NAME + "(" + COLUMN_ID +
            " integer primary key autoincrement," + COLUMN_ARTIKAL  +
            " text not null ," + COLUMN_PRICE + " real not null ," +
            COLUMN_AMOUNT + " integer not null)";

如果您发现任何问题,请发表评论。

答案 1 :(得分:1)

您忘了用逗号替换

的代码
private static final String DATABASE_CREATE = "create table " +
        TABLE_NAME + "(" + COLUMN_ID +
        " integer primary key autoincrement," + COLUMN_ARTIKAL  +
        " text not null" + COLUMN_PRICE + " real not null" +
        COLUMN_AMOUNT + " integer not null);";

private static final String DATABASE_CREATE = "create table " +
        TABLE_NAME + "(" + COLUMN_ID +
        " integer primary key autoincrement," + COLUMN_ARTIKAL  +
        " text not null," + COLUMN_PRICE + " real not null," +
        COLUMN_AMOUNT + " integer not null)";

答案 2 :(得分:1)

我对您的代码进行了一些细微的更改。您可以使用相同的参考。

根据您的要求修改以下内容。我有一个类似的样本,我修改了相同的代码。我不确定这是不是最好的方法。但您可以使用以下内容并根据您的要求进行修改。

在您的MainActivity中添加

Button DB=(Button)findViewById(R.id.DB);
DB.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) 
{
     Double price = Double.parseDouble(et2.getText().toString());
     int amount = Integer.parseInt(et3.getText().toString());
     MySQLiteHelper db = new MySQLiteHelper (MainActivity.this);
     db.createItem(new Item(et1.getText().toString(),price,amount));
     db.close();
}
});

MySQLiteHelper

public class MySQLiteHelper extends SQLiteOpenHelper {

public static final String TABLE_NAME = "caffe";
//    private SQLiteDatabase database;
//    private MySQLiteHelper dbHelper;
private String[] allColumns =    {MySQLiteHelper.COLUMN_ARTIKAL,MySQLiteHelper.COLUMN_PRICE, MySQLiteHelper.COLUMN_AMOUNT};

public static final String COLUMN_ID = "_id";
public static final String COLUMN_ARTIKAL = "artikal";
public static final String COLUMN_PRICE = "price";
public static final String COLUMN_AMOUNT = "amount";
// public static final String COLUMN_TIME = "date&time";
Context context;

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

// changed the below    
private static final String DATABASE_CREATE = "create table " +
        TABLE_NAME + "(" + COLUMN_ID +
        " integer primary key autoincrement," + COLUMN_ARTIKAL  +
        " text not null," + COLUMN_PRICE + " real not null," +
        COLUMN_AMOUNT + " integer not null)";

public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    context= context;
}

@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL(DATABASE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(MySQLiteHelper.class.getName(),
        "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}


    public void createItem(Item item) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(MySQLiteHelper.COLUMN_ARTIKAL, item.getArticle().toString());
        values.put(MySQLiteHelper.COLUMN_PRICE, Double.toString(item.getPrice()).toString());
        values.put(MySQLiteHelper.COLUMN_AMOUNT, Integer.toString(item.getAmount()).toString());
        //Toast.makeText(context, "Inserted", 1000).show();
        db.insert(MySQLiteHelper.TABLE_NAME, null,values);

    }

    public List<Item> getAllItems() {

        List<Item> items = new ArrayList<Item>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.query(MySQLiteHelper.TABLE_NAME,
            allColumns, null, null, null, null, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
          Item cursorItem = cursorToItem(cursor);
          items.add(cursorItem);
          cursor.moveToNext();
        }

        cursor.close();
        return items;
    }

    private Item cursorToItem(Cursor cursor) {
        Item item = new Item();
        item.setArticle(cursor.getString(0));
        item.setPrice(cursor.getDouble(1));
        item.setAmount(cursor.getInt(2));

        return item;
    }
}

项目类

public class Item {

String article;
Double price;
int amount;

public Item()
{

}
public Item(String article,Double price, int amount)
{
    this.article=article;
    this.price=price;
    this.amount= amount;
}
public String getArticle() {
    return article;
}

public void setArticle(String article) {
    this.article = article;
}

public Double getPrice() {
    return price;
}

public void setPrice(Double price) {
    this.price = price;
}

public int getAmount() {
    return amount;
}

public void setAmount(int amount) {
    this.amount = amount;
} 

}

快照

enter image description here

在显示按钮上单击显示。吐司只显示文章名称。

     MySQLiteHelper db = new MySQLiteHelper (MainActivity.this);
 List<Item> contacts = db.getAllItems();       
 StringBuilder sb = new StringBuilder();
 for (Item cn : contacts) 
     {
   sb.append(cn.getArticle());
   sb.append("\n");            
}
Toast.makeText(MainActivity.this,sb, 1000).show();

enter image description here