2012-04-30 21 views
0

トピックは、sqliteで新しいテーブルを作成する際のいくつかの問題があることを暗示しています。私は自分のコードで何をするのですか?私はdb内に新しいテーブルを作成することはできません。私がdbを見れば、単にandroid_metadata tbと他に何もありません。新しいものを作成するためのコードは次のとおりです。DB/TBの名前を変更し、アプリを再インストールします。テーブルを作成できません。SQLite/Android

... 
this.createTable(R.string.nametable, "_id INT PRIMARY KEY, " + "parentID INT, " + "name TEXT"); 
... 

public void createTable(int id, String sql) { 
     String table = this.getStringById(id); 
     String _sql = "CREATE TABLE " + table + "(" + sql + ")"; 
     Log.d("Controller.createTable", _sql); 
     this.mCurrentConnection.rawQuery(_sql, null); 
     try { 
      Cursor c = this.Select(id, "*", null); 
      c.close(); 
      Log.d("Controller.createTable", "create finished"); 
     } catch (Exception e) { 
      Log.d("Controller.createTable", "can't create table: " + table); 
     } 
    } 

私はすべてを試した開いたり、私のアプリ

if(this.mCurrentConnection == null || !this.mCurrentConnection.isOpen()) { 
      this.mCurrentConnection = this.mContext.openOrCreateDatabase(this.mDB, Context.MODE_PRIVATE , null); 
     } 

のコンストラクタでDBを作成します、 ";"またはコマンドの最後に、新しいクリーンなVMを試してみてください。 私のprobを修正する有用な既存の投稿/回答が見つかりませんでした。 私のphpMyAdminで_sql文を実行

CREATE TABLE name_table(_id INT PRIMARY KEY, parentID INT, name TEXT) 

(MySQLの)すべてが正常に動作している場合。

私を助けることができれば嬉しいです。

よろしくアレックス

EDIT:(以下のコメントのための答え)

@VikramBodicherla:それはPROBです。 create文自体は例外を発生させませんでした。 34:14.834:E /データベース(305):選択(チェック)ステートメントは

4月30日07を投げないエラー挿入のParentID = -1 名= blabla 4月30日07:34:14.834を:E /データベース(305):android.database.sqlite.SQLiteException:

そのようなテーブル:NAME_TABLE:、コンパイル中:INSERT INTOを NAME_TABLE(のParentID、名)VALUES(?、?)。 04030 07:34:14.834:とandroid.database.sqlite.SQLiteProgram.native_compile(ネイティブメソッド) 04-30 07:34:14.834:E/Database(305):at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110) 04-30 07:34:14.834:E /データベース(305): android.database.sqlite.SQLiteProgram(SQLiteProgram.java:59 ) 04-30 07:34:14.834:E /データベース(305): とandroid.database.sqlite.SQLのステートメント(SQLiteStatement.java:41) 04-30 07:34:14.834:E /データベース(305 ): android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1027) 04-30 07:34:14.834:E /データベース(305): android.database.sqlite.SQLi (SQLiteDatabase.java:1213) 04-30 07:の場合、SQLiteDatabase.java:1286) :34:14.834:E/Database(305): unicorn.Heurazio.Controller.addName(Controller.java:156)04-30 07:34:14.834:E /データベース(305): unicorn.Heurazio .Controller.install(Controller.java:135)04-30 07:34:14.834:E /データベース(305): でunicorn.Heurazio.StartUpActivity.onCreate(StartUpActivity.java:22) 04-30 07: 34:14.834:E /データベース(305): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-30 07:34:14.834:E /データベース(305): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 04-30 07:34:14.834:E /データベース(305): android.app.ActivityThread。(ActiThread.java:119)04-30 07:34:で、ハンドルランニングアクティビティ(ActivityThread.java:2512) 04-30 07:34:14.834:E /データベース(305) E /データベース(305): android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863) 04-30 07:34:14.834:E /データベース(305): android.os Handler.dispatchMessage(Handler.java:99)04-30 07:34:14.834:E /データベース(305): android.os.Looper.loop(Looper.java:123)04-30 07:34: (305): android.app.ActivityThread.main(ActivityThread.java:4363)04-30 07:34:14.834:E /データベース(305): java.lang.reflectで、14.834: E /データベース.Method.invokeNative(ネイティブM 03-30 07:34:14.834:E /データベース(305): の場合java.lang.reflect.Method.invoke(Method.java:521)04-30 07:34:14.834: E/Database (305): com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.runZygoteInit.java:860) 04-30 07:34:14.834:E /データベース(305): com.android.internal.os .ZygoteInit.main(ZygoteInit.java:618)4月30日 07:34:14.834:E /データベース(305): dalvik.system.NativeStart.main(ネイティブメソッド)で

+0

これを使ってみましたか?http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – xandy

+0

logcat stacktraceも投稿できますか?私はあなたが例外を実行していると仮定します。 –

+0

はいそれも試しました。しかし私は私がこのアプローチをスキップするように私は1つを必要としなかったと思う。私が間違っているなら私を修正してください。SQLiteOpenHelperはアップグレード用です。 – Alex

答えて

1

あなた本当に実際にはSQLiteOpenHelperクラスとそれに関連付けられたpatternを使用します。アップグレードだけでなく、テーブルもきれいに作成します。

また、あなたのcreate文は、おそらく次のようになります。

CREATE TABLE name_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, parentID INTEGER, name TEXT) 

EDITを:あなたの痕跡から、あなたのCREATE TABLEを実行されることはありません(したがって、テーブルが存在しません)。 SQLiteOpenHelper関数とexecSQL関数を使用してテーブルを作成し、すべて設定する必要があります。

+0

すべてのprimkeyはsqlite [link](http://www.sqlite.org/faq.html#q1)で自動インクリメントされます。うーん、私はそれを試してみてください。 – Alex

+0

大丈夫、今はなぜうまくいかなかったのか分かります。 私は2つのアプローチ 1を試してみた:SQLiteOpenHelper(正確に例など)を実装 - > 2を働いた:SQLiteOpenHelperなししかしExecSqlの(ないrawQuery)で再びそれを試してみました - >も 間違いを働いた "使用していました「execSQL」の代わりに「rawQuery」を使用します。私は "CREATE TABLE ..."と思って成功すると本当のようなものを返します。しかし明らかにそれdosen't。 助けてくれてありがとう – Alex

0

04-30 07:34:14.834:E /データベース(305):parentid = -1 name = blabla 04-30 07:34:14.834:E/Database(305):android.database.sqlite .SQLiteException:

あなたのエラースタックによると、-1を親として挿入しようとしていますか?親がプライマリキーで負の値を受け付けません

+0

CREATE TABLE name_table(_id INT PRIMARY KEY、parentID INT、name TEXT)|それは主キーではありません;)_idは...;) – Alex

関連する問題