2010-12-08 15 views
18

ちょっと、AUTO_INCREMENT列を持つデータベースを作成したいと思います。しかし、メソッド挿入の値を解析する方法はわかりません。私は何をAUTO_INCREMENT引数に構文解析するのか分からず、auto_incrementをどこに置くべきか1を解析しましたが、私はそれを解析してはいけないことを知っています。AndroidのSQLiteデータベースでAUTO_INCREMENTを作成するには?

ここでは、CallDatHelper.javaクラスのメソッド挿入を宣言するクラスと、データベースを作成するメソッドを示します。

package com.psyhclo; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteStatement; 
import android.util.Log; 

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

public class CallDataHelper { 

private static final String DATABASE_NAME = "calls.db"; 
private static final int DATABASE_VERSION = 1; 
private static final String TABLE_NAME = "contact_data"; 

private Context context; 
private SQLiteDatabase db; 

public CallDataHelper(Context context) { 
    this.context = context; 
    OpenHelper openHelper = new OpenHelper(this.context); 
    this.db = openHelper.getWritableDatabase(); 
} 

public boolean insert(Integer cId, String cName, String numType, 
     String cNum, String dur, String date, String currTime) { 
    this.db.execSQL("insert into " 
      + TABLE_NAME 
      + "(id, contact_id, contact_name, number_type, contact_number, duration, date, current_time, cont) " 
      + "values(? ," + cId + ", " + cName + ", " + numType + ", " 
      + cNum + ", " + dur + ", " + date + ", " + currTime + ", ?)"); 
    return true;   
} 

public void atualiza(String word) { 
    this.db.execSQL("UPDATE words SET cont = cont + 1 WHERE (word= ?)", 
      new String[] { word }); 
} 

public void deleteAll() { 
    this.db.delete(TABLE_NAME, null, null); 
} 

public boolean select(String wrd) { 

    String word; 
    Cursor cursor = this.db.query(TABLE_NAME, new String[] { "word" }, 
      "word like ?", new String[] { wrd }, null, null, null); 
    if (cursor.moveToFirst()) { 
     do { 
      word = cursor.getString(0); 
     } while (cursor.moveToNext()); 
    } 
    if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
     return true; 
    } else { 
     return false; 
    } 
} 

public List<String> selectAll() { 
    List<String> list = new ArrayList<String>(); 
    Cursor cursor = this.db.query(TABLE_NAME, new String[] { "word" }, 
      null, null, null, null, "cont desc"); 
    if (cursor.moveToFirst()) { 
     do { 
      list.add(cursor.getString(0).toUpperCase()); 
     } while (cursor.moveToNext()); 
    } 
    if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 
    return list; 
} 

private static class OpenHelper extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " 
       + TABLE_NAME 
       + "(id INTEGER PRIMARY KEY AUTOINCREMENT, contact_id INTEGER, contact_name VARCHAR(50), number_type VARCHAR(50), contact_number VARCHAR(50), duration TIME, date DATE, current_time TIME, cont INTEGER)"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w("RatedCalls Database", 
       "Upgrading database, this will drop tables and recreate."); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 
} 
} 

そして、ここで私は私が挿入したいデータを解析挿入メソッドを呼び出すところです。

this.dh.insert(1 , 1, contactName, numType, contactNumber, 
        duration, callDate, currTime); 
+2

は私がここにセキュリティ上の発言を作ってみましょう:手動で次のようにSQLクエリを構築することは非常に難しいハッキング手に入れたいレシピです。攻撃者がこれらの引数のいずれかの値を決定すると、クエリは完全に変更できます。詳細はこちら:http://en.wikipedia.org/wiki/SQL_injection – MarioVilas

答えて

13

あなたは何かを解析する必要はありません。列がAUTOINCREMENTとして作成された場合は、単に他の値渡し:

ContentValues values = new ContentValues(); 
values.put("contact_id", cId); 
values.put("contact_name", cName); 
// etc. 
db.insert(TABLE_NAME, null, values); 
+1

これを別のクラスに実装する方法は?他のクラスでこのメソッドを呼び出す方法、それを参照して適切な引数を解析する方が良いでしょうか? – rogcg

+0

まあ...あなたはすでにそのための方法を持っています、それを使うだけです...何が問題なのですか? – Cristian

+0

私は、db.insertメソッドをアクティビティ権で呼び出さなければならないと言っていますか?しかし、このメソッドを呼び出すには、SQLiteDatabaseオブジェクトであるオブジェクトdbを起動する必要があります。しかし、それをどのように活動に誘発するのか?私は、プライベートSQLiteDatabase db = 'what ???'を意味します。 – rogcg

1

this.db.insert(:ところで

db.execSQL("insert into " 
     + TABLE_NAME 
     + "(contact_id, contact_name, number_type, contact_number, duration, date, current_time, cont) " 
     + "values("+ cId + ", " + cName + ", " + numType + ", " 
     + cNum + ", " + dur + ", " + date + ", " + currTime + ", ?)"); 

を、常にAndroidのinsertメソッドを使用してデータを挿入することをお勧めしますNULL、1、contactName、numType、contactNumber、 duration、callDate、currTime);

+5

Javaには' NULL'キーワードはありません。 – Cristian

21

MYSQLのように、特にAUTO_INCREMENTを書く必要はありません。

主キーフィールドを_id INTEGER PRIMARY KEYと定義するだけで済みます。

テーブルを作成するときにプライマリキーフィールドをINTで定義していると、うまくいきません。それはINTEGERでなければなりません。

レコードを挿入するときに提出し、主キーに任意の値を渡さない場合は、それが自動的に一意の値(MYSQL AUTO_INCREMENTが動作するのと同じ方法)であると値が増加します

+4

質問のどこにでもMySQLの言及がないようです。 – XTL

+5

私はJibWが単にMySQLとの比較を行い、より良いことを説明していると思います。 – MarioVilas

+3

母、それは私の問題でした。私はそれをINTと宣言した;)ありがとう。 – Pijusn

1

最終静的な文字列データベース名= "empDb .db ";

public DatabaseHelper(Context context) { 
    super(context, Database_name, null, 1); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table emp_tbl (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,salary TEXT)"); 
} 

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

詳細 https://www.youtube.com/watch?v=W8-Z85oPNmQ ブログ取得:https://itmulc.blogspot.com/2016/08/android-sqlite-database-with-complete.html

関連する問題