2017-01-03 111 views
1

我在創建Android Studio中的Android應用程序的過程中獲得URL的圖像。一路上我遇到了一些麻煩。我正在使用一個非常標準的ListView,可以添加和刪除項目 - 這一點是完美的。爲了將數據存儲在用戶手機上(因爲我還沒有自己的服務器),我選擇將數據存儲在用戶的手機上。問題下載從SQLite數據庫

爲了存儲數據爲我所用下面的教程,但改變了一些列的名稱和添加列,以滿足我的需求http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/創建一個SQLite數據庫的應用程序。

一個我創建的列包含一個URL來電影海報圖像。我的對象類下載這個圖像,並將其設置爲一個Drawable - 這一點也是完美的。我能夠成功地將URL存儲在數據庫中,並在重新加載應用程序時正確取出。但是,當我重新加載應用程序時,即使將正確的URL傳遞給Object類,ListView中的項目也不會下載圖像。請幫我看看我哪裏出錯了。代碼如下。提前致謝!

數據庫助手(在這裏我CRUD SQLite數據庫)

public class DatabaseHandler extends SQLiteOpenHelper{ 
//database version 
private static final int DATABASE_VERSION = 1; 
//database name 
private static final String DATABASE_NAME = "moviesManager"; 
//table name 
private static final String TABLE_MOVIES = "movies"; 
//table column names 
private static final String KEY_ID = "idSTRING"; 
private static final String KEY_TITLE = "Title"; 
private static final String KEY_YEAR = "Year"; 
private static final String KEY_RATING = "Rating"; 
private static final String KEY_POSTER = "URL"; 

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

//creating tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_MOVIES_TABLE = "CREATE TABLE " + TABLE_MOVIES + "(" 
      + KEY_ID + "STRING PRIMARY KEY," + KEY_TITLE + " TEXT," 
      + KEY_YEAR + " TEXT," + KEY_RATING + " TEXT," 
      + KEY_POSTER + " TEXT" + ")"; 
    db.execSQL(CREATE_MOVIES_TABLE); 
} 

//upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MOVIES); 
    //create table again 
    onCreate(db); 
} 

//CRUD (Create, Read, Update, Delete) Operations 
//add new movie 
void addMovie(Movie movie){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_ID, movie.getId()); 
    values.put(KEY_TITLE, movie.getTitle()); 
    values.put(KEY_YEAR, movie.getYear()); 
    values.put(KEY_RATING, movie.getRating()); 
    values.put(KEY_POSTER, movie.getImgUrl()); 
    //Log.e("poster:", values.get(KEY_POSTER).toString()); 

    //Inserting row 
    db.insert(TABLE_MOVIES, movie.getId(), values); 
    //Log.e("Poster in DB: ",getMovie(movie.getId()).getImgUrl()); 
    db.close(); //closing database connection 
} 

public List<Movie> getAllMovies(){ 
    List<Movie> movieList = new ArrayList<>(); 
    String selectQuery = "SELECT * FROM " + TABLE_MOVIES; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    //looping through all rows and adding to list 
    if(cursor.moveToFirst()) { 
     do{ 
      Movie movie = new Movie(); 
      movie.setId(cursor.getString(0)); 
      movie.setTitle(cursor.getString(1)); 
      movie.setYear(cursor.getString(2)); 
      movie.setRating(cursor.getString(3)); 
      movie.setPoster(cursor.getString(4)); 
      movieList.add(movie); 
     }while(cursor.moveToNext()); 
    } 
    //cursor.close(); 
    return movieList; 
} 
    ... 
} 

從MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    ... 

    lv = (ListView) findViewById(R.id.list); 
    movies = db.getAllMovies(); 
    mAdapter = new MovieAdapter(this, movies); 
    lv.setAdapter(mAdapter); 

    ... 
} 

從電影類:

... 
public void setPoster(String imgUrl) { 
    this.imgUrl = imgUrl; 
    this.poster = LoadImageFromWebOperations(this.imgUrl); 
} 

private static Drawable LoadImageFromWebOperations(String url) { 
    try { 
     InputStream is = (InputStream) new URL(url).getContent(); 
     return Drawable.createFromStream(is, "src name"); 
    } catch (Exception e) { 
     Log.e("err","poster not found at "+url); 
     return null; 
    } 
} 

讓我知道,如果需要更多的信息回答我的問題。

+0

這可能不相關,但可能會解決一些你的未來的問題。你有沒有看過使用圖像加載庫,如Glide或Picasso?https://github.com/bumptech/glide http://square.github.io/picasso/ – riggaroo

+0

@riggaroo我會研究這些庫。我對android開發相對來說比較陌生,試圖讓我的腳在這裏,但還沒有探索外部庫。 – JFKDevelopers

+0

好吧,通常試圖做你自己的圖像加載和緩存可能是一場噩夢,這就是爲什麼像這樣的圖書館存在。 – riggaroo

回答

1

由於riggaroo建議使用圖書館爲這些類型的任務,因爲他們異步加載圖像,還可以管理存儲是非常有用的。

我個人建議使用畢加索爲這樣的任務。

你只需要導入畢加索lib和添加此行代碼來加載圖像。

Picasso.with(this).load("YOUR IMAGE URL HERE")into(imageView); 

導入庫和更多的使用是指here Picaso Guide

+1

另一個很好的選擇是** [Glide](https://github.com/bumptech/glide)**庫 – Meet

+0

感謝您的回覆。我正在研究使用畢加索圖書館來滿足我的需求。無論如何,在我創建的類中使用此代碼?由於「無法從靜態上下文中引用」,因此我將上下文部分解決了問題。有任何想法嗎? – JFKDevelopers

+0

您可以將活動'Context'傳遞給您在構造函數或方法參數中創建的類。 – Jayanth