2012-01-27 14 views
0

SQLiteデータベースを作成して、データを初期設定しています。私は、Eclipseでのデバッガを介して、プログラムを実行すると、画面に何も表示されませんが、私はLogCatから次を得る:SQLiteでテーブルが作成されていません

sqlite returned: error code = 1, msg = no such table: Issues 

は、ここでは、コードの一部です(私は必要なのものだけを表示するようにしようとするでしょうが、あなたが必要な場合は詳細を参照するために、plzは)私に知らせてください:

MainActivity.java IssueInfoCreatorため

public class MainActivity extends Activity { 

//TAG for LogCat. 
public static final String TAG = "SQLiteDebug"; 
private ListView mListViewIssues; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Load listview control. 
    mListViewIssues = (ListView)findViewById(R.id.listIssues); 

    //Create Data Creator. 
    IssueInfoCreator creator = new IssueInfoCreator(this); 

    creator.open(); 
    try { 
     creator.insertRandomData(); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //add data to listview through adapter. 
    mListViewIssues.setAdapter(new IssueInfoAdapter(this, creator.queryAll())); 

    //Close connection. 
    creator.close(); 
} 
} 

コード:

public class IssueInfoCreator { 

//DB Adapter. 
private DBAdapter mDBAdapter; 

//Constructor. 
public IssueInfoCreator(Context c){ 
    mDBAdapter = new DBAdapter(c); 
} 

//Open DBAdapter. 
public void open(){ 
    mDBAdapter.open(); 
} 

//Insert Random Data to get started. 
public void insertRandomData() throws ParseException{ 
    long i = 999; 
    Date dtDate = new Date(); 
    dtDate.parse("1/12/2012"); 

    mDBAdapter.insertIssue(i++, dtDate, "This is my ticket. I'm having trouble starting my sim."); 
    mDBAdapter.insertIssue(i++, dtDate, "I can't my sim to turn on, please help."); 
    mDBAdapter.insertIssue(i++, dtDate, "Aircraft is not responding to callsign."); 
    mDBAdapter.insertIssue(i++, dtDate, "TTS is not recognising when we attempt to land an aircraft."); 
} 

//Get all Issues from DB. 
public List<IssueInfo> queryAll(){ 
    return mDBAdapter.fetchAllIssues(); 
} 

//close connection. 
public void close(){ 
    mDBAdapter.close(); 
} 
} 
DBAdapterため

コード:

public class DBAdapter { 

//Database fields. 
public static final String ISSUES_TABLE = "Issues"; 
public static final String COL_ISSUE_ID = "_id"; 
public static final String COL_DATE_RECEIVED = "DateReceived"; 
public static final String COL_ISSUE_SUMMARY = "IssueSummary"; 

//Declarations. 
private Context mContext; 
private SQLiteDatabase mDB; 
private DBHelper mDBHelper; 

//Constructor. 
public DBAdapter(Context c){ 
    mContext = c; 
} 

//Open DB Connection. 
public DBAdapter open() throws SQLException{ 
    mDBHelper = new DBHelper(mContext); 
    mDB = mDBHelper.getWritableDatabase(); 
    return this; 
} 

//Close DB Connection. 
public void close(){ 
    mDBHelper.close(); 
} 
//remaining code omitted for brevity... 
} 

し、最終的にDBHelperのためのコード:

public class DBHelper extends SQLiteOpenHelper { 

//Constants 
private static final String DB_NAME = "dbOpenIssues"; 
private static final int DB_VERSION = 1; 
private static final String CREATE_DB_SQL = 
     "CREATE TABLE Issues (" + 
       "_id int PRIMARY KEY, " + 
       "DateReceived datetime NOT NULL, " + 
       "IssueSummary text NOT NULL " + 
       ");"; 
private static final String DROP_TABLE = 
     "DROP TABLE IF EXISTS Issues"; 

public DBHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_DB_SQL); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL(DROP_TABLE); 
    onCreate(db); 
} 
} 

私は付属のエミュレータでそれを実行した場合、私はDBは、ファイルエクスプローラではなく、私がある場合に作成されることがわかりますそれをローカルにプルダウンしてSQLiteManで開くと、android_metadataテーブルのみが表示されます。

アイデア?もう一度、長いポストにごめんなさい、何も残したくないので、10回別々に再投稿しなければなりません。

UPDATE:私が試した

ことの一つは、LogCatでSQL文を印刷しましたが、私はと呼ばれることは決してありません(DBHelper中)のonCreateに気づい:

public void onCreate(SQLiteDatabase db){ 
    Log.e("DB ERROR -- ", CREATE_DB_SQL); 
    db.execSQL(CREATE_DB_SQL); 
} 

答えて

2

...データベースを削除し、あなたはそれが機能するようになりましたかどうかを確認するために行われた変更を使用してプログラムを再実行してください。データを保存するには、TEXTを使用します。だからあなたの場合には、以下のことができるクエリ:

private static final String CREATE_DB_SQL = 
     "CREATE TABLE Issues (" + 
       "_id integer PRIMARY KEY, " + 
       "DateReceived text NOT NULL, " + 
       "IssueSummary text NOT NULL)"; 

Hereは、データ型へのリンクです。

+0

でもこれを試しましたが運がありません....同じエラーです。 – Robert

+1

ファイルシステムからデータベースを削除し、再度アプリケーションを実行してみてください。 – Yury

+0

DBを削除してプログラムを再度実行すると、問題が解決されました。信じられないほど、笑...助けてくれてありがとう、私はこれに何時間も執着していた。このアプリはデータを表示していない(しかし、SQLiteManを通してそこにあることを確認した)が、私はそれを理解できると信じている。 エミュレータはDBをメモリなどにキャッシュしていますか? – Robert

0

onCreate()をすると、データベースと呼ばれていますはじめて作成されます。したがって、テーブルの作成に失敗したのにデータベースがすでに作成されている場合は、onCreate()は再度呼び出されません。

は、SQLiteのには日時型がありません

+0

私は_idを生成して挿入していますので、自動インクリメントはできません。 – Robert

+0

あなたの言っていることを理解していますが、IssueInfoCreatorクラスを通して呼び出されていると思います。新しいIssueInfoCreator(this)は新しいDBAdapter(c)を呼び出し、コンストラクタにDBHelperのインスタンスを作成し、.getWritableDatabase()メソッドを呼び出します。そんなことはできないの? – Robert

+0

実際、あなたは正しいです。 Androidドキュメントによると、onCreate()を呼び出す必要があります。ただし、初めてデータベースを作成するときにはonCreate()が呼び出されます。 – Luis

0

adbを使用してエミュレータでSQL Create文を実行しようとしましたか?あなたが精通していない場合はここで

は、adbの詳細は次のとおりです。http://developer.android.com/guide/developing/tools/adb.html

Android上でsqliteの問題をデバッグするとき、私は、SQLは、エミュレータ内部から手動でコマンドを実行してみるために、その最も簡単に見つけます。

+0

エミュレータにはありませんが、SQLiteManで実行しましたが、テーブルを作成しています(それはdatetimeをテキストに変更した後です)が、同じエラーでエラーが発生しています。 – Robert

関連する問題