2017-08-17 4 views
0

良い日コーダー。私はログインとアプリケーションを作成しました。この1週間は、私はYouTubeでたくさんのチュートリアルを終わりましたが、何も、私を信じて、何も私を助けることはできません。 Stackoverflowは私の最後の希望です。登録情報をSQliteデータベースに保存しようとしています。私はデータベースをチェックしており、そこに値はありません。私のコードは次のようアンドロイドルックスでSQLiteデータベースを使用したアンドロイドアプリケーションのログインと登録

public void insertRegister() { 
     try { 
      String Username = txtUserName.getText().toString(); 
      String Password = txtPassword.getText().toString(); 
      String Name = txtName.getText().toString(); 
      String ConfirmPassword = txtConfirmPassword.getText().toString(); 
      String Email = txtEmail.getText().toString(); 
      Boolean Reg_vali = true; 


       //Insert into database 
       long id = db_class.InsertRegisterDetails(Name, Username, Password, Email, ConfirmPassword); 
} 

とデータベースクラスを下回っている:

private static final String Username = "username"; 
    private static final String Password = "password"; 
    private static final String Name = "name"; 
    private static final String Email = "email"; 
    private static final String ConfirmedPassword = "confirmed_password"; 
    private static final String TAG = "DBAdapter"; 

    private static final String DATABASE_NAME = "DB_Skyetek_Login.db"; 
    private static final String DATABASE_TABLE = "tblLogin"; 
    private static final int DATABASE_VERSION = 1; 
    SQLiteDatabase db; 

    static final String DATABASE_CREATION = 
      "create table " + DATABASE_TABLE + " (registerid INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + " username text not null, " 
        + " name text not null, " + 
        " email text not null, " + 
        " confirmed_password text not null, " + 
        " password text not null);"; 

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

    public void onCreate(SQLiteDatabase db) { 
     try 
     { 
      db.execSQL(DATABASE_CREATION); 
      this.db = db; 
     } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

どこからDATABASE_TABLEの名前を取得しますか?私はこれの回避策の答えを投稿します。また、Reg_valiを使用してコード内のどこにも使用していない場合は、関数に追加するのを忘れていた可能性があります(テーブルに入るかもしれませんが、構造化されていません) – MirzaS

+0

テーブル作成テーブル –

+0

@ BhuvaneshBsそれをチェックしてください –

答えて

0

ここではそのために少しの回避策です:

私は私のテーブルを作成した場所です

//---insert a employee into the database--- 

public long InsertRegisterDetails(String name,String username,String password,String email, String confirm_password) 

{ 
    db = this.getWritableDatabase(); 
    ContentValues RegisterValues = new ContentValues(); 

    RegisterValues.put(Username, username); 
    RegisterValues.put(Name, name); 
    RegisterValues.put(Email, email); 
    RegisterValues.put(Password, password); 
    RegisterValues.put(ConfirmedPassword, confirm_password); 
    return db.insert(DATABASE_TABLE, null, RegisterValues); 

    } 

String ROW1 = "INSERT INTO " + DATABASE_TABLE + " (" 
      + Username + ", " + Name + ", " 
      + Email + ", " + Password + ", " 
      + ConfirmedPassword + ") Values ("+username+", "+name+", "+email+", "+password+", "+confirm_password+")"; 
db.execSQL(ROW1); 

私はあなたが使用しているキーと大文字で始まるものが実際の値であることを合計します。

+0

あなたの応答をありがとう。今すぐテストします@MirzaS –

0

データベースonCreate()を作成中にdbを割り当てないでください。

onCreateが呼び出されると、有効なデータベースが存在します。そうでない場合は、db.execSQLは機能しません。しかし、onCreateが呼び出される前に、クラス変数dbはnullになります。もちろんonCreateが呼び出されるのは、データベースが存在しない場合(つまり、getWriteableDatabaseまたはgetReadabledatabaseが呼び出され、データベースファイルが存在しない場合にonCreateが呼び出された場合)、データベースが存在する場合(たとえば、2回目のAppの実行)dbには値が代入されず(onCreateは呼び出されないため)、nullになります。そのため、this.db = dbをonCreateで使用しないでください。

データベースの実装は、このようにする必要があります。

class Database { 
private static final String Username = "username"; 
private static final String Password = "password"; 
private static final String Name = "name"; 
private static final String Email = "email"; 
private static final String ConfirmedPassword = "confirmed_password"; 
private static final String TAG = "DBAdapter"; 

private static final String DATABASE_NAME = "DB_Skyetek_Login.db"; 
private static final String DATABASE_TABLE = "tblLogin"; 
private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_CREATION = 
     "create table " + DATABASE_TABLE + " (registerid INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + " username text not null, " 
       + " name text not null, " + 
       " email text not null, " + 
       " confirmed_password text not null, " + 
       " password text not null);"; 

private SQLiteDatabase writableDatabase; 
private MyDatabase database; 

public Database(Context context) { 
    database = new MyDatabase(context); 
    writableDatabase = database.getWritableDatabase(); 
} 

private static class MyDatabase extends SQLiteOpenHelper { 

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

    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DATABASE_CREATION); 
    } 

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

public long InsertRegisterDetails(String name, String username, String password, String email, String confirm_password) { 
    ContentValues RegisterValues = new ContentValues(); 
    RegisterValues.put(Username, username); 
    RegisterValues.put(Name, name); 
    RegisterValues.put(Email, email); 
    RegisterValues.put(Password, password); 
    RegisterValues.put(ConfirmedPassword, confirm_password); 
    return writableDatabase.insert(DATABASE_TABLE, null, RegisterValues); 
} 

public void closeDatabase() { 
    if (database != null) 
     database.close(); 
} 
} 

上記の方法のようにデータベースを実装します。それが動作します。

詳細については、このリンクをご覧ください。情報MikeTため

http://www.journaldev.com/9438/android-sqlite-database-example-tutorial

感謝。

+0

onCreateが呼び出された時点で有効なデータベースが存在します。それ以外の場合は 'db.execSQL'は動作しません。しかし、 'onCreate'が呼び出される前にクラス変数** db **はnullになります。もちろん、onCreateはデータベースが存在しない場合にのみ呼び出されます。つまり、getWriteableDatabaseまたはgetReadabledatabaseが呼び出され、データベースファイルが存在しない場合はonCreateが呼び出されます。 ** db **には値が割り当てられず(onCreateが呼び出されないため)、nullになります。そのため、 'this.db = db;'は 'onCreate'で使われるべきではありません。 – MikeT

+0

ニースマイク。良い情報、私は私の答えにこの情報を追加します。 –

+0

@MikeTありがとう、私を助けるためにあなたのタイムアウトを取ってくれました。質問があります。上記のコードには次の行が含まれています:private MyDatabase database; <---- MyDatabaseを参照するものです。それは私が取り組んでいる現在のクラス名ですか、それとも何ですか?理由は私の "プライベート静的クラスDB_Class SQLiteOpenHelperを拡張"が "Dublicateクラス 'DB_Class'"というエラーを与えているため、私が求めている理由です。それ以外のエラーはありません。 –

関連する問題