2011-10-17 3 views
0

getIntent를 사용해야하지만 수행 할 수없는 이유는 SQLiteOpenHelper의 생성자가 아니며 getIntent를 다음과 같이 사용해야하기 때문입니다. onCreate 내에서.onCreate는 SQLiteOpenHelper의 생성자가 아니지만 getIntet에 필요합니다.

이 경우 SQLiteOpenHelper에서 어떻게 액세스 할 수 있습니까?

기본적으로 SQLiteOpenHelper 내에서 다음 코드를 처리하려고하는데 문제가 있습니다.

 public void onCreate(Bundle savedInstanceState) { 
     onCreate(savedInstanceState); 
     sortTypePassed=getIntent().getStringExtra(SmithRockScreenActivity.SORT_TYPE_VAR); 
    } 

String 값에 따라 데이터베이스의 쿼리 종류를 수행하려고합니다.

package com.pocketbeta; 


import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Locale; 

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.os.Bundle; 
import android.util.Log; 


class SmithRockDatabase extends SQLiteOpenHelper { 

public String sortTypePassed = "null"; 

private static final String DATABASE_PATH = "/data/data/com.pocketbeta/databases/"; 
private static final String DATABASE_NAME="smithrockdb.db"; 
private static final int SCHEMA_VERSION=1; 
public static final String TABLE_NAME = "SmithRockRoutes"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_TITLE = "route_name"; 
public static final String COLUMN_YDSRATING = "yds_rating"; 
public static final String COLUMN_QUALITY = "quality"; 
public static final String COLUMN_IMAGE = "route_photo"; 
public static final String COLUMN_ROUTEVIDEO = "route_video"; 
public static final String COLUMN_TICKLIST = "ticklist"; 
public static final String COLUMN_AREA = "area"; 
public static final String COLUMN_ROUTETYPE = "route_type"; 
public static final String COLUMN_ROUTEDESCRIPTION = "route_description"; 

public SQLiteDatabase dbSqlite; 

private final Context myContext; 

public SmithRockDatabase(Context context) { 
    super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
    this.myContext = context; 
    // check if exists and copy database from resource 
    //createDB(); 
} 


@Override 
public void onCreate(SQLiteDatabase db) { 
    // check if exists and copy database from resource 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 
public void createDatabase() { 
    createDB(); 
} 

private void createDB() { 

    boolean dbExist = DBExists(); 

    if (!dbExist) { 

     //By calling this method we create an empty database into the default system location 
     //We need this so we can overwrite that database with our database. 
     this.getReadableDatabase(); 
     //now we copy the database we included! 
     copyDBFromResource(); 


    } 



}  

private boolean DBExists() { 

    SQLiteDatabase db = null; 

    try { 
     String databasePath = DATABASE_PATH + DATABASE_NAME; 
     db = SQLiteDatabase.openDatabase(databasePath, null, 
       SQLiteDatabase.OPEN_READWRITE); 
     db.setLocale(Locale.getDefault()); 
     db.setLockingEnabled(true); 
     db.setVersion(1); 



    } catch (SQLiteException e) { 

     Log.e("SqlHelper", "database not found"); 

    } 

    if (db != null) { 


     db.close(); 

    } 


    return db != null ? true : false; 
} 

private void copyDBFromResource() { 

    InputStream inputStream = null; 
    OutputStream outStream = null; 
    String dbFilePath = DATABASE_PATH + DATABASE_NAME; 

    try { 

     inputStream = myContext.getAssets().open(DATABASE_NAME); 

     outStream = new FileOutputStream(dbFilePath); 

     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      outStream.write(buffer, 0, length); 
     } 

     outStream.flush(); 
     outStream.close(); 
     inputStream.close(); 

    } catch (IOException e) { 

     throw new Error("Problem copying database from resource file."); 

    } 

} 

public void openDataBase() throws SQLException { 

    String myPath = DATABASE_PATH + DATABASE_NAME; 
    dbSqlite = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READWRITE); 

} 

@Override 
public synchronized void close() { 

    if (dbSqlite != null) 
    { 
     dbSqlite.close(); 
    } 
    super.close(); 

} 

// NEED TO GET THIS CODE TO WORK TO BRING IN VALUE FROM OTHER INTENT!!!!!!!!!!!!!!!!!! 

// public void onCreate(Bundle savedInstanceState) { 
// onCreate(savedInstanceState); 
// sortTypePassed=getIntent().getStringExtra(SmithRockScreenActivity.SORT_TYPE_VAR); 
//} 
// } 


public Cursor getCursor() { 



    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 

    queryBuilder.setTables(TABLE_NAME); 

    String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE, COLUMN_YDSRATING, COLUMN_ROUTETYPE, COLUMN_AREA, COLUMN_ROUTEVIDEO, COLUMN_ROUTEDESCRIPTION}; 

    if (sortTypePassed.equals("nameSort")) { 

     Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
       null, null, null, "route_name ASC"); 

     return mCursor; 

    } else { 

     Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
       null, null, null, "yds_rating ASC"); 

     return mCursor; 

    } 

} 


public String getName(Cursor c) { 


    return(c.getString(1)); 

} 

public String getRating(Cursor c) { 
    return(c.getString(2)); 
} 
public String getArea(Cursor c) { 
    return(c.getString(4)); 
} 
public String getRouteVideo(Cursor c) { 
    return(c.getString(5)); 
} 
public String getRouteDescription(Cursor c) { 
    return(c.getString(6)); 
} 

public String getRouteType(Cursor c) { 

    String routeValue=""; 
    routeValue=(c.getString(3)); 
    String noSelection = ""; 

    if (routeValue != null) { 
     return c.getString(3); 

    } else { 
     return(noSelection); 

    } 


} 

}

+0

전반적으로 달성하려는 내용을 말씀해 주시겠습니까? 쿼리를 수행하기 위해 값을 전달하려고합니까? SQLiteOpenHelper에서 getIntent()를 시도하는 경우 해당 클래스가 뷰에서 완전히 분리되어야하므로 뭔가 이상하지 않습니다. 주 활동은 SQLiteOpenHelper 클래스를 호출해야합니다. – Jack

+0

변수 값을 기반으로 데이터베이스의 반환을 정렬해야합니다. 예를 들어 사용자가 주 화면의 버튼을 클릭하여 번호순으로 정렬하거나 이름순으로 정렬하는 경우입니다. – Adam

답변

0

이 사건되고, 어떻게 내가 SQLiteOpenHelper 내에서 액세스를 얻을 것이다 :

여기
public Cursor getCursor() { 



    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 

    queryBuilder.setTables(TABLE_NAME); 

    String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE, COLUMN_YDSRATING, COLUMN_ROUTETYPE, COLUMN_AREA, COLUMN_ROUTEVIDEO, COLUMN_ROUTEDESCRIPTION}; 

    if (sortTypePassed.equals("nameSort")) { 

     Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
       null, null, null, "route_name ASC"); 

     return mCursor; 

    } else { 

     Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
       null, null, null, "yds_rating ASC"); 

     return mCursor; 

    } 

는 전체 길이의 코드는 다음과 같이?

이상적으로는 getIntent()SQLiteOpenHelper에서 액세스 할 수 없습니다. SQLiteOpenHelper에 생성자를 구현하고 (힌트 : 이미 가지고 있음) 필요한 모든 데이터를 전달합니다. 이상적으로 이것은 이 아니며은 활동을 전달하는 것을 포함하지만 오히려 어디서나 활동을 얻습니다 (예 : Intent 추가).

+0

그래, 외부 변수를 기반으로 SQLiteOpenHelper에서 데이터를 정렬해야합니다. 3 가지 다른 스타일을 정렬하려면 3 가지 SQLitOpenHelpers를 작성해야합니다. SQLiteHelper에서 정렬 중에 변수 검사를 수행하고 그에 따라 정렬 할 수 있다면 3 가지 헬퍼를 작성하고 참조하지 않아도됩니다. – Adam

+0

@Adam : 그런 다음 값을 매개 변수로 전달하여 생성자 또는 호출하는 메서드에 매개 변수로 전달하여 정렬과 관련된 쿼리를 수행하도록합니다. – CommonsWare

+0

@Adam getItems (string sortOrder)와 같은 별도의 메소드를 사용하지 않는 이유는 무엇입니까? 반환하는 객체 (getUsers, getPages 등)와 항목을 바꿉니다. 생성자에서 값을 전달하는 데 국한되지 않습니다. – Jack

관련 문제