2014-02-18 46 views
0

我又有一個問題:( 我遇到這個錯誤是它不會創建一個名爲contacts的表,但我有創建數據庫的代碼,但它沒有創建it.How解決此再次感謝您的回答android SQLite數據庫..沒有這樣的表格:

package com.mobilebasedsignlanguage; 

import java.io.ByteArrayOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ListView; 

public class alphaconv extends Activity { 
ArrayList<Contact> imageArry = new ArrayList<Contact>(); 
ContactImageAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.alphabetview); 

    DataBaseHandler db = new DataBaseHandler(this); 
    //get image from drawable.. 
    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.a); 

    //convert bitmap to byte 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte imageInByte[] = stream.toByteArray(); 
    //Inserting Contacts 
    Log.d("Insert: ", "Inserting .."); 
    db.addContact(new Contact("A", imageInByte)); 

    //Read all contacts from db 
    List<Contact> contacts = db.getAllContacts(); 
    for(Contact cn: contacts) { 
     String log = "ID: " + cn.getID() + "Name: " + cn.getName() + ", Image: " + cn.getImage(); 

     Log.d("Result: ", log); 
     imageArry.add(cn); 
    } 

    adapter = new ContactImageAdapter(this, R.layout.screen_list, imageArry); 
    ListView dataList = (ListView)findViewById(R.id.list); 
    dataList.setAdapter(adapter); 

} 

} 

這裏是其他Java類:?

Contact.java

package com.mobilebasedsignlanguage; 

public class Contact { 

int _id; 
String _name; 
byte[] _image; 

public Contact() { 

} 

public Contact(int keyId, String name, byte[] image) { 
    this._id = keyId; 
    this._name = name; 
    this._image = image; 
} 

public Contact(String contactID, String name, byte[] image) { 
    this._name = name; 
    this._image = image; 
} 

public Contact(String name, byte[] image) { 
    this._name = name; 
    this._image = image; 
} 

public int getID() { 
    return this._id; 
} 

public void setID(int keyId) { 
    this._id = keyId; 
} 

public String getName() { 
    return this._name; 
} 

public void setName(String name) { 
    this._name = name; 
} 

public byte[] getImage() { 
    return this._image; 
} 

public void setImage(byte[] image) { 
    this._image = image; 
} 

} 

CONTA ctImageAdapter.java

package com.mobilebasedsignlanguage; 

import java.io.ByteArrayInputStream; 
import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ContactImageAdapter extends ArrayAdapter<Contact>{ 
Context context; 
int layoutResourceId; 

ArrayList<Contact> data=new ArrayList<Contact>(); 
public ContactImageAdapter(Context context, int layoutResourceId, ArrayList<Contact> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ImageHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ImageHolder(); 
     holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 
     holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ImageHolder)row.getTag(); 
    } 

    Contact picture = data.get(position); 
    holder.txtTitle.setText(picture._name); 

    byte[] outImage = picture._image; 
    ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage); 
    Bitmap theImage = BitmapFactory.decodeStream(imageStream); 
    holder.imgIcon.setImageBitmap(theImage); 
    return row; 
} 

static class ImageHolder 
{ 
    ImageView imgIcon; 
    TextView txtTitle; 
} 


} 

DbHandler.java

package com.mobilebasedsignlanguage; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseHandler extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_NAME = "SLdb"; 

private static final String TABLE_CONTACTS = "contacts"; 

private static final String KEY_ID = "id"; 
private static final String KEY_NAME = "name"; 
private static final String KEY_IMAGE = "image"; 

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

public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
      + KEY_IMAGE + " BLOB" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 

    onCreate(db); 
} 

public void addContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact._name); 
    values.put(KEY_IMAGE, contact._image); 

    db.insert(TABLE_CONTACTS, null, values); 
    db.close(); 
} 

Contact getContact(int id) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, 
      KEY_NAME, KEY_IMAGE }, KEY_ID + "=?", 
      new String[] { String.valueOf(id) }, null,null,null,null); 
    if(cursor != null) 
     cursor.moveToFirst(); 

    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getBlob(1)); 

    return contact; 
    } 

public List<Contact> getAllContacts() { 
    List<Contact> contactlist = new ArrayList<Contact>(); 
    String selectQuery = "SELECT * FROM contacts ORDER BY name"; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    if(cursor.moveToFirst()) { 
     do { 
      Contact contact = new Contact(); 
      contact.setID(Integer.parseInt(cursor.getString(0))); 
      contact.setName(cursor.getString(1)); 
      contact.setImage(cursor.getBlob(2)); 

      contactlist.add(contact); 
     }while (cursor.moveToNext()); 
    } 

    db.close(); 

    return contactlist; 
} 

public int updateContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.getName()); 
    values.put(KEY_IMAGE, contact.getImage()); 

    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
      new String[] { String.valueOf(contact.getID()) });  
} 

public void deleteContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?", 
      new String[] {String.valueOf(contact.getID()) }); 
    db.close(); 
} 

public int getContactsCount() { 
    String countQuery = "SELECT * FROM " + TABLE_CONTACTS; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(countQuery, null); 
    cursor.close(); 

    return cursor.getCount(); 
} 

} 

在日誌貓的錯誤是這樣的:

02-18 11:49:25.938: E/SQLiteLog(6044): (1) no such table: contacts 
02-18 11:49:26.078: E/SQLiteDatabase(6044): Error inserting image=[[email protected] name=A 
02-18 11:49:26.078: E/SQLiteDatabase(6044): android.database.sqlite.SQLiteException: no such table: contacts (code 1): , while compiling: INSERT INTO contacts(image,name) VALUES (?,?) 
+3

如果你沒有任何變化表架構的數據庫文件不會自動更新。強制執行的最簡單方法是卸載應用程序,以便數據庫被刪除並再次調用onCreate()。 – laalto

+0

如何做到這一點先生?我仍然試圖運行它到模擬器@laalto – kathleen55

+0

例如,'adb uninstall your.package.name' – laalto

回答

0

不要在onCreate方法日誌或敬酒,看它是否就是所謂的如果是,那麼刪除舊錶,因爲這隻被調用一次,如果表已經存在,它將不會再次執行。

此外,請嘗試使用下面的查詢,有時創建語句中的空格導致問題。

String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + " (" 
     + KEY_ID + " INTEGER PRIMARY KEY, " + KEY_NAME + " TEXT, " 
     + KEY_IMAGE + " BLOB" + ");"; 
0

的問題是,你是不是重寫SQLiteOpenHelperonCreate方法,所以它不會被調用。

嘗試把override註解放在onCreateonUpgrade方法:

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
     + KEY_IMAGE + " BLOB" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

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

    onCreate(db); 
} 
+0

我試圖包括覆蓋,但它沒有找到相同的表。 @giacomoni – kathleen55

+0

您可以嘗試將數據庫版本更改爲2(隨着我的答案中的更改),然後它將重新創建數據庫。也許它還沒有被創建,你第一次運行它。 – Giacomoni

相關問題