2017-10-12 2 views
-1

어떻게 쿼리의 (?) 문자열을 연결 하시겠습니까? 또는 % s는 PHP를 좋아합니다 ... 나는 +로 make를 알고 있지만, 그렇지 않습니다! 쿼리가 필요합니다 PHP와 같은 문자열 값을 변경 하시겠습니까? 또는 (안드로이드 자바에서 유사한) % s의 ... 프로젝트의 모든 모델에 대한Android Java 쿼리 문자열 변수 선언 후 동적 값

package yyy.yyy.yyy.yyy.actions; 

import android.content.Context; 

import yyy.yyy.yyy.yyy.models.CategoriesModel; 

public class CategoriesActions extends CategoriesModel { 
    protected String sqlInsert = "INSERT INTO categories (title) VALUES (?) "; 
    protected String sqlUpdate = "UPDATE categories SET title=? WHERE id=?"; 
    protected String sqlDelete = "UPDATE FROM categories WHERE id=?"; 
    protected String sqlSelect = "SELECT %s FROM categories %s %s %s"; // ? or %s 

    public CategoriesActions(Context context) { 
     super(context); 
    } 

    public boolean insert() 
    { 
     String cat_title = this.getTitle(); 
     String sql = sqlInsert; // <---------- need concatenate cat_title in sqlInser (?) 

     //return sql; 
     return this.RunQuery(sql); 
    } 

    public String update() 
    { 
     String sql = ""; 
     return sql; 
    } 

    public String delete() 
    { 
     String sql = ""; 
     return sql; 
    } 

    public String select(String columns, String where, String order, String limit) 
    { 
     String sql = ""; 
     return sql; 
    } 
} 

dbConnection 레이어

package yyy.yyy.yyy.yyy.database; 

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

public class dbConnection extends SQLiteOpenHelper { 
    private SQLiteDatabase conn; 

    public static final String DATABASE_NAME="App.Xitano"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String TABLE_CATEGORIES = "categories"; 
    private static final String TABLE_PAYMENT_TYPES = "payment_types"; 
    private static final String TABLE_TRANSACTIONS = "transactions"; 

    private static final String CATEGORIES_KEY_ID = "id"; 
    private static final String CATEGORIES_KEY_TITLE = "title"; 
    private static final String CATEGORIES_KEY_CREATED_AT = "created_at"; 
    private static final String CATEGORIES_KEY_UPDATED_AT = "updated_at"; 

    private static final String PAYMENT_TYPES_KEY_ID = "id"; 
    private static final String PAYMENT_TYPES_KEY_TITLE = "title"; 
    private static final String PAYMENT_TYPES_KEY_CREATED_AT = "created_at"; 
    private static final String PAYMENT_TYPES_KEY_UPDATED_AT = "updated_at"; 

    private static final String TRANSACTIONS_KEY_ID = "id"; 
    private static final String TRANSACTIONS_KEY_IN_OUT = "in_out"; 
    private static final String TRANSACTIONS_KEY_CATEGORIES_ID = "categories_id"; 
    private static final String TRANSACTIONS_KEY_PAYMENT_TYPES_ID = "payment_types_id"; 
    private static final String TRANSACTIONS_KEY_TITLE = "title"; 
    private static final String TRANSACTIONS_KEY_AMOUNT = "amount"; 
    private static final String CTRANSACTIONS_KEY_CREATED_AT = "created_at"; 
    private static final String TRANSACTIONS_KEY_UPDATED_AT = "updated_at"; 

    private static final String CREATE_TABLE_CATEGORIES = "CREATE TABLE " + TABLE_PAYMENT_TYPES + "(" 
      + PAYMENT_TYPES_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + PAYMENT_TYPES_KEY_TITLE + " TEXT," 
      + PAYMENT_TYPES_KEY_CREATED_AT + "TIMESTAMP," 
      + PAYMENT_TYPES_KEY_UPDATED_AT + "TIMESTAMP);"; 

    private static final String CREATE_TABLE_PAYMENT_TYPES = "CREATE TABLE " + TABLE_CATEGORIES + "(" 
      + CATEGORIES_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + CATEGORIES_KEY_TITLE + " TEXT," 
      + CATEGORIES_KEY_CREATED_AT + "TIMESTAMP," 
      + CATEGORIES_KEY_UPDATED_AT + "TIMESTAMP);"; 

    public dbConnection(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     Log.d("table", TABLE_CATEGORIES); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     /* 
     db.execSQL(CREATE_TABLE_STUDENTS); 
     db.execSQL(CREATE_TABLE_USER_HOBBY); 
     db.execSQL(CREATE_TABLE_USER_CITY); 
     */ 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     /* 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER + "'"); 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER_HOBBY + "'"); 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER_CITY + "'"); 
     onCreate(db); 
     */ 
    } 

    public SQLiteDatabase ConnectWritable(){ 
     this.conn = this.getWritableDatabase(); 
     return this.conn; 
    } 

    public SQLiteDatabase ConnectReadable(){ 
     this.conn = this.getReadableDatabase(); 
     return this.conn; 
    } 

    public boolean RunQuery(String sql){ 
     SQLiteDatabase stm = this.ConnectWritable(); 
     stm.execSQL(sql); 
     return true; 
    } 

    public Cursor RunSelect(String sql){ 
     SQLiteDatabase stm = this.ConnectReadable(); 
     Cursor cursor = stm.rawQuery(sql, null); 
     return cursor; 
    } 

    public int RunCount(String sql){ 
     SQLiteDatabase stm = this.ConnectReadable(); 
     Cursor cursor = stm.rawQuery(sql, null); 
     cursor.moveToFirst(); 
     if (cursor.getCount() > 0 && cursor.getColumnCount() > 0) { 
      cursor.close(); 
      return cursor.getInt(0); 
     } else { 
      cursor.close(); 
      return 0; 
     } 
    } 

    public void Disconnect(){ 
     this.conn.close(); 
     this.conn = null; 
    } 
} 

모델 레이어 (dbConnection를 확장 (프로젝트의 모든 모델이 클래스 (일반)의 확장) 클래스 (일반)

package yyy.yyy.yyy.yyy.models; 

import android.content.Context; 

import yyy.yyy.yyy.yyy.database.dbConnection; 

import java.io.Serializable; 

public class CategoriesModel extends dbConnection implements Serializable { 
    private int id; 
    private String title; 

    public CategoriesModel(Context context) { 
     super(context); 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getTitle() { 
     return title; 
    } 
} 

당신을 감사합니다!

+0

Google에서 Java로 작성된 진술을 제안하십시오! – bated

+0

나는이 문안에 좋거나 준비되어있는 말을 믿지 않는다! –

+0

내가이 게시물에 레이어를 업데이 트하고 삽입 ... 사람이 레이어 에서이 작업을 만들기위한 아이디어가 있습니까? ty –

답변

-1

해결 :

protected String sqlInsert = "INSERT INTO categories (title) VALUES (%s) "; 
public boolean insert() 
{ 
    String sql = String.format(sqlInsert, this.getTitle()); 
    return this.RunQuery(sql); 
} 

는 감사, 친구!

+1

당신이 읽을 것을 권 해드립니다 이 https://stackoverflow.com/questions/2099425/when-should-we-use-a-preparedstatement-instead-of-a-statement] – bated

0

당신은 준비된 명령문이 언급 "이 계층에는 좋지 않습니다."그러나 준비된 진술이 왜 당신에게 효과가 없을까요? 코드에서 예를 들어, 당신은이 :

protected String sqlInsert = "INSERT INTO categories (title) VALUES (?) "; 
쉽게 준비된 문을 만들 수 있습니다

: 다음

PreparedStatement pstmt = con.prepareStatement(sqlInsert); 

당신이 세트를 사용하여 쿼리에 관련된 매개 변수를 전달하기 만하면됩니다() 메소드를 준비된 진술에 사용할 수 있습니다. 자세한 내용은 here을 참조하십시오.

+0

예. 나는 그것을 만든다. 그러나 나는 나의 층에서 좋은 pratices를 필요로한다! 내 레이어에서 나는 prepareStatement 변수가 필요하며 dbConnection 레이어에서만 가능합니다! –

+0

내가 어떻게 알 필요가 작업 계층 (비슷한) ... 레이어 변수를 바인딩에 대한 비슷한 기능 ... 나는 다른 코드에서 dbConnection에서 만들지 만 나쁜 사례입니다 ... –