2011-09-29 10 views
19

人の名前と電子メールIDを含む簡単なテーブルを作成しました。アンドロイドデータベースのテキストフィールドにプライマリキーを適用することは可能ですか

"create table contacts (name text not null, email text primary key not null);"

しかし、これは動作していない:私はこのようなクエリを作成与えているとき。実行中に例外やエラーが発生せず、主キーが機能しています。

enter image description here

それが唯一の整数に主キーを適用することが可能である:SQLiteのブラウザを使用してテーブルを閲覧している間、私は唯一の4つのデータタイプがあることを観察しましたか?テキストフィールドにプライマリキーが必要な場合はどうなりますか?ありがとうございました。 SQLiteのドキュメントのfaqあたりとして

public class DBAdapter { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_EMAIL = "email"; 
private static final String TAG = "DBAdapter"; 

private static final String DATABASE_NAME = "MyDB"; 
private static final String DATABASE_TABLE = "contacts"; 
private static final int DATABASE_VERSION = 2; 

private static final String DATABASE_CREATE = 
    "create table contacts (_id integer primary key autoincrement, " 
    + "name text not null, email text not null);"; 

private final Context context;  

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 

public DBAdapter(Context ctx) 
{ 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     try { 
      db.execSQL(DATABASE_CREATE);  
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

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

//---opens the database--- 
public DBAdapter open() throws SQLException 
{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

//---closes the database---  
public void close() 
{ 
    DBHelper.close(); 
} 

//---insert a contact into the database--- 
public long insertContact(String name, String email) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_EMAIL, email); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

//---deletes a particular contact--- 
public boolean deleteContact(long rowId) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

//---retrieves all the contacts--- 
public Cursor getAllContacts() 
{ 
    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, 
      KEY_EMAIL}, null, null, null, null, null); 
} 

//---retrieves a particular contact--- 
public Cursor getContact(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
      KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, 
      null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

//---updates a contact--- 
public boolean updateContact(long rowId, String name, String email) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_NAME, name); 
    args.put(KEY_EMAIL, email); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 
} 
+0

テーブルを作成するコードを投稿できますか? – Noel

答えて

18

を、主キーが動作するはずのためデータ型としてTEXTを使用して:これは私が使用するコードです。

あなたのクエリを使用しましたが、ここではテーブルが作成されます。それは間違っていたところ

enter image description here

enter image description here

CREATE TABLE contacts (email text primary key not null, name text not null); 

INSERT INTO contacts VALUES ('[email protected]', 'sample') 
INSERT INTO contacts VALUES ('[email protected]', 'sample') 

は今ここにあります。私は

​​

再びこれを実行したときに

は何も、エラーが起こっていません。 しかし、レコードを更新しませんでした。だから私はデータの整合性があると結論するしかし、あなたは失敗についてのフィードバックを得ることはありません

+0

はい。わかった。返信ありがとうございます – Pramod

+0

重複値の挿入を知る方法を教えてください? – sai

+0

@sai、私の記事の最後の2行をお読みください。 – Samuel

10

SQLiteDatabase.insertOrThrow()は、値を挿入できなかった場合は例外をスローする必要があります。 戻り値は、SQLiteDatabase.insert()からのものも、挿入された行のrowidまたは失敗した場合は-1です。コード内でこれらの選択肢のいずれかを選択する必要があります。

関連する問題