Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/55: Рейтинг темы: голосов - 55, средняя оценка - 4.69
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
1

Как загружать/хранить файл в SQLite?

12.02.2015, 21:35. Показов 11154. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть список, нужно по клику на айтеме открывать текстовый файл или картинку, и вопрос стоит в том как их доблять к определенному айтему с сохранением в SQLite (ну т.е. добавил файл и когда надо открыл), ну или как это вообще делается?

1. какой принцип?
2. какой примерно код должен быть на кнопке выбора файла?
3. как этот файл или его путь должен и сохраняться в sqlite или ресурсах?

Подскажите пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2015, 21:35
Ответы с готовыми решениями:

Безопасно ли хранить данные в SQLite?
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Безопасно ли хранить данные в...

Где хранить текстовый файл
Мне нужно в AndroidStudio считать текстовый файл, но я не знаю куда его нужно засунуть. Где...

Как правильно загружать изображения?
Разрабатываю приложение для игры. Уже выпустил тестовую версию и из первой сотни установивших у...

Как загружать картинки на стену Вконтакте?
Проблему с авторизацией решил, но не пойму как загружать картинки. Помогите:)

17
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
13.02.2015, 09:14 2
Картинки храните в assets/files/drawable, а в бд пути к файлам. Считываете то что в итеме и соответсвенно ему читаете путь к картинке.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
13.02.2015, 09:22  [ТС] 3
Rube, рад видеть...

Картинки храните в assets/files/drawable
если просто нужно хранить картинку в БД тут понятно, а если в приложении ее надо загрузить напр с sd-карты, что должно быть на кнопке выбора файла, и чтоб сам файл копировался в этот assets?

а в бд пути к файлам
БОЛЬШОЙ вопрос, как запилить путь к файлу в БД?
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
13.02.2015, 11:51 4
В БД файлы как таковые не хранятся, только пути у ним, загрузить с карты вполне возможно (я с этим не работал еще), но не в assets (т.к. эта папка доступна только при разработке приложения, как и drawable), а в пространство приложения (напр. в папку files).
Как запилить путь к файлу в БД - сперва надо сохранить файл, а в БД вставить путь - пара строк кода. Получить путь тоже легко.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
20.02.2015, 16:59  [ТС] 5
Rube, таки "Продолжаем разговор" ©Карлсон.

научился закидывать путь на картинку которая хранится на SD-карте в создаваемой программой папке в базу SQLite.
Java
1
2
3
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileUri());
            startActivityForResult(intent, REQUEST_CODE_PHOTO);
Java
1
2
3
4
5
6
7
8
9
private Uri generateFileUri() {
            
              file = new File(/*directory.getPath(FilePath)*/"/mnt/sdcard/Cribe/Photo" + "/" + "photo_"
                  + System.currentTimeMillis() + ".jpg");
                    Log.d(TAG, "fileName = " + file);
                    FilePath=file.toString();
            return Uri.fromFile(file);
                    
          }
Java
1
2
3
4
5
6
public void onButtonClick(View view) {
            if (Predmet[id_predm] == "Математика") {
                // добавляем запись
                    if(FilePath!=null){         
                db.addRec(et.getText().toString(), R.drawable.andr, FilePath);
......
и остановился с вопросом о том, как(и чем) по клику на айтеме открывать картинку по пути который есть в базе, и может (если это не сложно) открывать эту картинку в новом активити приложения с возможностью масштабирования, не знаю как логичнее, может я и загнул с этим?
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
21.02.2015, 22:00 6
Я думаю надо открывать новый активити с ImageView. Путь получаем из БД путем чтения id из адаптера и кидаем его в источник для ImageView. Как-то так.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
23.02.2015, 11:11  [ТС] 7
Rube,
Путь получаем из БД путем чтения id из адаптера
путь получил он лежит в String link, если я правильно понимаю то мои id_col и arg3 - это одно и то же, только получено разными способами или я ошибаюсь?

если да то с id_col понятно, а откуда адаптер знает id ?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
 
                    final ImageView img = (ImageView)findViewById(R.id.imageView1);
                    id_col= cursor.getInt(0);
                    String link= cursor.getString(3);
                //   String st=String.valueOf(id_col); 
                                         String st=String.valueOf(arg3);
                     
                     Toast tst = Toast.makeText(getBaseContext(), link, Toast.LENGTH_SHORT);
                        tst.show();
 
                            }
кидаем его в источник для ImageView
подскажите пожалуйста поподробнее источник вроде это - findViewById(R.id.imageView1);, а как-так мой путь туда "кидать" ?

P/S/ наклевывается такая мысля:
Java
1
2
3
4
//  img.set(незнаю каким методом, и что передать arg3 или id_col);
                        
                        intent = new Intent(getApplicationContext(), ImageV.class);
                        startActivity(intent);
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
23.02.2015, 21:46 8
Цитата Сообщение от disx Посмотреть сообщение
откуда адаптер знает id
Если не путаю, arg3 это порядковый номер итема в листвью, отсюда получаем значение адаптера по позиции arg3. Т.е. данные адаптера и отображение в листвью это одно и тоже.
Цитата Сообщение от disx Посмотреть сообщение
подскажите пожалуйста поподробнее источник вроде это - findViewById(R.id.imageView1)
Java
1
2
ImageView img = (ImageView) findViewById(R.id.imageView1);
img.setImageDrawable(Drawable.createFromPath("/mnt/sdcard/***.jpg"));
Это лишнее в слушателе, если, я так понимаю ImageView будет в другой активити?
Java
1
final ImageView img = (ImageView)findViewById(R.id.imageView1);
Передавайте путь в интенте через putExtra, а во 2-й активити ищите img и сетьте путь.

Добавлено через 3 минуты
А путь картинки из БД получите запросом после нахождения значения из адаптера. Т.е. найти путь WHERE полетакоето = 'значение'.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
24.02.2015, 11:34  [ТС] 9
Rube, значение из адаптера это - String st=String.valueOf(arg3); ?

Т.е. найти путь WHERE полетакоето = 'значение'.
найти путь - чем это делается ?,

запрос как-то так должен быть "SELECT*FROM 'DB_TABLE' WHERE 'lnk'='что здесь должно быть?'"

lnk - это столбец где хранятся пути.

куда вставлять этот запрос?

Добавлено через 10 минут
во второй активити сделал так:

Java
1
2
3
4
5
6
    
        ImageView imview = (ImageView)findViewById(R.id.imageView1);
        Intent intent = getIntent();
        
        String FilePath = intent.getData().getPath(); //Выкидывает пока по этой строчке NullPointerEx...
        imview.setImageDrawable(Drawable.createFromPath(FilePath));
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
24.02.2015, 12:36 10
Цитата Сообщение от disx Посмотреть сообщение
запрос как-то так должен быть "SELECT*FROM 'DB_TABLE' WHERE 'lnk'='что здесь должно быть?'"
lnk - это столбец где хранятся пути.
куда вставлять этот запрос?
"SELECT lnk FROM 'DB_TABLE' WHERE 'поле1' = тут значение из адаптера, что там у вас в листвью отображается?
Я не могу уже отвечать на вопросы в слепую, не зная полной картины приложения.
Допустим в бд хранятся дни недели (day) и пути к картинкам (path), заполняем листвью курсорадаптером так:
"SELECT day FROM 'DB_TABLE'
Щелкаем по итему Среда, значит arg2 = 2
Java
1
2
3
4
Cursor cursor = (Cursor) arg0.getItemAtPosition(arg2); // получаем курсор в позиции 2
Intent intent = new Intent(this, ImageV.class);
intent.putExtra("ключ", cursor.getString(0)); // передаем в интент значение курсора (Среда), где 0 - первый столбец
startActivity(intent);
Во 2-м активити получаем интент (Среда) и засылаем запрос
"SELECT path FROM DB_TABLE WHERE day = 'Среда'"
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
24.02.2015, 13:01  [ТС] 11
Rube, Извиняюсь, но чета совсем потерял "нить повествования"......

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
public class OneActivity extends Activity {
 
    private static final int CM_EDIT_ID = 0;
    private static final int CM_DELETE_ID = 1;
    private static final int IDD_EDIT = 2;
    protected static final int RUS = 1;
    protected static final int MATH = 0;
    
 
    final String TAG = "MyLog";
    ListView lvData, LOne;
    public DB db;
    Intent intent;
String arg=null;
    int id_col;
    SimpleCursorAdapter scAdapter;
    private Cursor cursor;
    EditText et, et2;
 
    @SuppressWarnings("deprecation")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one);
 
        DB.etName = (EditText) findViewById(R.id.editText1);
        // открываем подключение к БД
        db = new DB(this);
        db.open();
 
        // получаем курсор
        cursor = db.getAllData(arg);
        startManagingCursor(cursor);
 
        // формируем столбцы сопоставления
        String[] from = new String[] {  DB.COLUMN_IMG, DB.COLUMN_TXT };
        int[] to = new int[] { R.id.ivImg, R.id.tvText };
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from,
                to);
        lvData = (ListView) findViewById(R.id.listView1);
        lvData.setAdapter(scAdapter);
 
        // добавляем контекстное меню к списку
        registerForContextMenu(lvData);
        
        lvData.setOnItemClickListener(new OnItemClickListener() {
            private int getSelectedItemPosition() {
                // TODO Auto-generated method stub
 
                return 0;
            }
 
            
            
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                
                //String request = db.query("SELECT lnk FROM 'DB_TABLE' WHERE 'поле1' = COLUMN_TXT");
                
                Cursor cursor = (Cursor) arg0.getItemAtPosition(arg2); // получаем курсор в позиции 2
                Intent intent = new Intent(getApplicationContext(), ImageV.class);
                intent.putExtra("ключ", cursor.getString(0)); // передаем в интент значение курсора (Среда), где 0 - первый столбец
                startActivity(intent);
                
 
//                  break;
//              case RUS:
//                  
//                  break;
//              default:
//                  break;
//              }
                            }
        });
 
 
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        menu.add(0, CM_EDIT_ID, 0, R.string.edit_record);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }
 
    @SuppressWarnings("deprecation")
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_EDIT_ID) {
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            cursor.moveToPosition(acmi.position);
            id_col = cursor.getInt(cursor.getColumnIndex(DB.COLUMN_ID));
 
            showDialog(IDD_EDIT);
            cursor.requery();
             return true;
 
        }
 
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.delRec(acmi.id);
            // обновляем курсор
            cursor.requery();
            Log.d(TAG, "Удалено");
             return true;
        }
        return super.onContextItemSelected(item);
    }
 
    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }
 
    @SuppressWarnings("deprecation")
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
 
        // removeDialog(id);
    }
 
    protected Dialog onCreateDialog(int id) {
 
        switch (id) {
        case IDD_EDIT:
            LayoutInflater inflater = LayoutInflater.from(this);
 
            View root = inflater.inflate(R.layout.dial, null);
            final EditText textName = (EditText) root.findViewById(R.id.name);
 
            textName.setText(cursor.getString(2));
 
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setView(root);
            builder.setTitle(R.string.title_edit);
            builder.setPositiveButton("Ок",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            String name = textName.getText().toString();
 
                            Toast toast = Toast.makeText(
                                    getApplicationContext(), name,
                                    Toast.LENGTH_SHORT);
                            toast.show();
 
                            db.updRec(id_col, name);
                            // db.insert(DB.DB_TABLE, null, cv);
                            // Cursor c = db.query("mytable", null, null, null,
                            // null, null, null);
 
                            dialog.cancel();
                            cursor.requery();
                        }
 
                    });
            builder.setNegativeButton("Отмена",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
 
                            dialog.cancel();
                            cursor.requery();
                        }
                    });
 
            builder.setCancelable(false);
            removeDialog(id);
            return builder.create();
        default:
            return null;
        
        }
        
    }
}
ImageV.class
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.cribactivity;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;
 
 
public class ImageV extends Activity {
    
    //PhotoViewAttacher mAttacher;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image);
        
        ImageView imview = (ImageView)findViewById(R.id.imageView1);
        Intent intent = getIntent();
        
        String FilePath = intent.getData().getPath();
        imview.setImageDrawable(Drawable.createFromPath(FilePath));
    }
}
DB.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.cribactivity;
 
 
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.widget.EditText;
 
public class DB {
    public static final Uri CONTENT_URI = Uri.parse(
            "content://com.samples.dbcontacts.contactprovider/contact");
      private static final String DB_NAME = "mydb";
      private static final int DB_VERSION = 1;
      public static final String DB_TABLE = "mytab";
      public static final String DB_TABLE2 = "mytab2";
     
      public static final String COLUMN_ID = "_id";
      public static final String COLUMN_IMG = "img";
      public static final String COLUMN_TXT = "txt";
      public static final String COLUMN_LNK = "lnk";
      
      public static final String COLUMN_ID2 = "_id";
        public static final String COLUMN_IMG2 = "img";
        public static final String COLUMN_TXT2 = "txt";
      
      public static EditText etName=null;
     
      private static final String DB_CREATE =
                "create table " + DB_TABLE + "(" +
                  COLUMN_ID + " integer primary key autoincrement, " +
                  COLUMN_IMG + " integer, " +
                  COLUMN_TXT + " text, " +
                  COLUMN_LNK + " text" +
                ");";
          
      
        
        private static final String DB_CREATE2 =
                "create table " + DB_TABLE2 + "(" +
                  COLUMN_ID2 + " integer primary key autoincrement, " +
                  COLUMN_IMG2 + " integer, " +
                  COLUMN_TXT2 + " text" +
                ");";
      private final Context mCtx;
     
     
      private DBHelper mDBHelper;
      private SQLiteDatabase mDB;
     
      public DB(Context ctx) {
        mCtx = ctx;
      }
     
      // открыть подключение
      public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
       
      }
     
      // закрыть подключение
      public void close() {
        if (mDBHelper!=null) mDBHelper.close();
      }
     
      // получить все данные из таблицы DB_TABLE
      public Cursor getAllData(String arg) {
        return mDB.query(DB_TABLE, null, null, null, null, null, null);
       
      }
      
      public Cursor getAllData2() {
            return mDB.query(DB_TABLE2, null, null, null, null, null, null);
            
          }
     
      // добавить запись в DB_TABLE
      public void addRec(String txt, int img, String lnk) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_IMG, img);
        cv.put(COLUMN_TXT, txt);
        cv.put(COLUMN_LNK, lnk);
        mDB.insert(DB_TABLE, null, cv);
      }
      
    // добавить запись в DB_TABLE
          public void addRec2(String txt, int img) {
            ContentValues cv = new ContentValues();
            cv.put(COLUMN_TXT2, txt);
            cv.put(COLUMN_IMG2, img);
            mDB.insert(DB_TABLE2, null, cv);
          }
      public void updRec(int id_col, String name) {
          ContentValues val=new ContentValues();
         // name = etName.getText().toString();
            
            val.put(COLUMN_TXT, name);
            
            mDB.update(DB_TABLE, val, "_id = " + id_col,null);
            //mDB.update(DB_TABLE, val, "_id="+id,null);
          }
      public void updRec2(int id_col, String name) {
          ContentValues val=new ContentValues();
         // name = etName.getText().toString();
            
            val.put(COLUMN_TXT2, name);
            
            mDB.update(DB_TABLE2, val, "_id = " + id_col,null);
            //mDB.update(DB_TABLE, val, "_id="+id,null);
          }
 
       
      // удалить запись из DB_TABLE
      public void delRec(long id) {
        mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
      }
      // удалить запись из DB_TABLE2
      public void delRec2(long id) {
        mDB.delete(DB_TABLE2, COLUMN_ID2 + " = " + id, null);
      }
      private Context getContext() {
        // TODO Auto-generated method stub
        return null;
    }
    // класс по созданию и управлению БД
      public class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context, String name, CursorFactory factory,
            int version) {
          super(context, name, factory, version);
        }
       
        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
          db.execSQL(DB_CREATE);
          db.execSQL(DB_CREATE2);
          
       
         
          ContentValues cv = new ContentValues();
          for (int i = 1; i < 5; i++) {
            cv.put(COLUMN_TXT2, "sometext " + i);
            cv.put(COLUMN_IMG2, R.drawable.andr);
            db.insert(DB_TABLE2, null, cv);
          }
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
      }
    public SQLiteDatabase getWritableDatabase() {
        // TODO Auto-generated method stub
        return null;
    }
 
    public void insert(String dbTable, Object object, ContentValues cv) {
        // TODO Auto-generated method stub
        mDB.insertOrThrow(DB_TABLE, null, cv);
    }
 
    public Cursor query(String string, Object object, Object object2,
            Object object3, Object object4, Object object5, Object object6) {
        // TODO Auto-generated method stub
        mDB.query(DB_TABLE, null, null, null, null, null, null);
        return null;
    }
    public Cursor query2(String string, Object object, Object object2,
            Object object3, Object object4, Object object5, Object object6) {
        // TODO Auto-generated method stub
        mDB.query(DB_TABLE2, null, null, null, null, null, null);
        return null;
    }
    
    }
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
24.02.2015, 13:17 12
Лучший ответ Сообщение было отмечено disx как решение

Решение

Java
1
2
String FilePath = intent.getData().getPath(); // Это что?
String FilePath = intent.getString("ключ", "");; // Надо так
1
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
24.02.2015, 16:00  [ТС] 13
Rube,

ну т.е. получается что в моем случае SQL-запросы не нужны?

Это что?
а х... его знает... убрал и поставил getString()

заработало, но еще некий затык, когда в приложении картинка сохраняется с фотика файл имеет путь /mnt/sdcard/Cribe/Photo/file.jpg с ним все ок, открывается (сетится в ImageView).

а если мы просто выбираем файл в галерее или папке то onActivityResult и в нем
Java
1
2
  Uri uri= data.getData();
                      String FilePath2 = uri.getPath();
возвращают /external/images/media/3 или /external/images/media/30478 и т.п. и вот они то не открываются (или не сетятся) открывается активити и белый экран виден, в чем может быть причина, можно как-то конвертнуть в /mnt/и т.п. или как это делается?
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
24.02.2015, 17:21 14
Цитата Сообщение от disx Посмотреть сообщение
заработало
Ну наконец-то!
Цитата Сообщение от disx Посмотреть сообщение
и вот они то не открываются
Разрешение в Манифесте есть? Гляди в логах что пишет.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
24.02.2015, 19:14  [ТС] 15
Rube, в манифесте разрешения такие:

XML
1
2
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
три последних лога:
Using default keymap: /system/usr/keychars/qwerty.kcm.bin
Starting: Intent { cmp=com.cribactivity/.ImageV (has extras) } from pid 327
Displayed com.cribactivity/.ImageV: +414ms
ошибок никаких, просто открывается белый экран.
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
25.02.2015, 09:54 16
Ну не знаю чем помочь, пробуйте методом тыка. Может путь некорректный, может картинка большая и нужно ее изменять, может еще что.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
26.02.2015, 22:09  [ТС] 17
может есть какой другой способ отображения картинки с путем вида /external/images/media/**** ?
0
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
27.02.2015, 08:42 18
Мучился примерно с такой же задачей.
По порядку
В папке assets файлы доступны только для чтения. Эта папка нужна для того чтобы вы могли положить туда свои файлы и сконвертировать их в исполняемый файл. Доступ к этим файлам осуществляется через Assetsmanger. Рекомендация создаете new Folder в папке Assets. Имя должно быть уникальным, так чтобы юзер не создавал у себя на устройстве такую же папку. Например так, путь к этим файлам выглядит как "PoliglotDictonaryPictures/hold.jpeg"
Узнать где находится ваш файл в папке assets или на устройстве можно по пути анализируя путь как строку.
Вот код как я это сделал. Загружаю картинку путь к которой хранится в бд.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public class MainActivity extends Activity {
TextView engWord, rusWord, association;
ImageView imageWord;
DictonaryDB dictDB;
Cursor cur;
//int engWordColIndex,rusWordColIndex,assWordColIndex,idImageColIndex;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        engWord=(TextView) findViewById(R.id.engWord);
        rusWord=(TextView) findViewById(R.id.rusWord);
        association=(TextView) findViewById(R.id.association);
        imageWord=(ImageView) findViewById(R.id.imageWord);
        
        dictDB=new DictonaryDB(this);
        
        
        SQLiteDatabase db = dictDB.getReadableDatabase();
        cur=db.query("dictonary", null, null, null, null, null, null);
        cur.moveToFirst();
        onShowRecord();//все создали курсор установили показываем запись из БД
    }
    public void onClickBnt(View v) {
        
        
        switch (v.getId()) {
        case R.id.btnEdit://переход в другую активность добавления слова
            int positionCursor=cur.getPosition();
            Intent intent=new Intent(this, EditDictonary.class);
            intent.putExtra("positionCursor", positionCursor);
            startActivity(intent);
            break;
        case R.id.btnBack://показываем предыдущего слова если записи больше нет, показ последнего слова
            if(!cur.moveToPrevious()){
                cur.moveToLast();
            }
            onShowRecord();//курсор установили показываем запись из БД
            break;
        case R.id.btnForward://показываем следующее слово если записи больше нет, показ первого слова
            if(!cur.moveToNext()){
                cur.moveToFirst();
            }
            onShowRecord();//курсор установили показываем запись из БД
            break;
        default:
            break;
        }
    }
    public void onShowRecord(){//показываем что записанов БД
        String puthImage;
        int aaa;
        boolean visible=true;
        int engWordColIndex=cur.getColumnIndex("engWord");
        int rusWordColIndex=cur.getColumnIndex("rusWord");
        int assWordColIndex=cur.getColumnIndex("association");
        int idImageColIndex=cur.getColumnIndex("puthImage");
        int visibleControll=cur.getColumnIndex("visible");
        aaa=cur.getInt(visibleControll);
        if(aaa == 1){
            visible=true;
        }
        else {
            visible=false;
        }
        //engWord.setVisibility(aaa);
        engWord.setText(cur.getString(engWordColIndex));
        rusWord.setText(cur.getString(rusWordColIndex));
        association.setText(cur.getString(assWordColIndex));
        puthImage=cur.getString(idImageColIndex);
        if(puthImage.indexOf("PoliglotDictonaryPictures") != -1){
            //Log.d(MY_LOG, "ищем картинку в папке assets");
            try {
                // получаем входной поток
                InputStream ims = getAssets().open(puthImage);
                // загружаем как Drawable
                Drawable d = Drawable.createFromStream(ims, null);
                // выводим картинку в ImageView
                imageWord.setImageDrawable(d);
            }
            catch(IOException ex) {
                imageWord.setImageResource(R.drawable.ic_launcher);
            }
        }
        else {
            //Log.d(MY_LOG, "ищем картинку путь  "+patch);
            try {//если картинки по этому пути нет, должно выскочить исключение
                FileInputStream fis=new FileInputStream(puthImage);
                Drawable dravImage=Drawable.createFromStream(fis, null);
                imageWord.setImageDrawable(dravImage);
            }
            catch (Exception e) {// обрабатываем исключение показываем ic_launcher
                imageWord.setImageResource(R.drawable.ic_launcher);
            }
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}
Таблицу создаем следующим образом вот код. Новый класс наследник от SQLiteOpenHelper. Если много записей то советуют воспользоваться Sql Manager. Правда еще не пробовал.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class DictonaryDB extends SQLiteOpenHelper {
    public static final String DB_DICT="dictDB.db";
    public static final String TABLE_NAME="dictonary";
    public static final String ENG_WORD="engWord";
    public static final String RUS_WORD="rusWord";
    public static final String ASSOCIATION="association";
    public static final String PUTCH_IMAGE="puthImage";
    public static final String VISIBLE="visible";
    public DictonaryDB(Context context){//, String name, CursorFactory factory,
            //int version) {
        super(context, DB_DICT, null, 1);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        boolean aaa=true;
        db.execSQL("create table " +TABLE_NAME
                +" (id integer primary key autoincrement, "
                +ENG_WORD+" text not null, "
                +RUS_WORD+" text not null, "
                +ASSOCIATION+" text, "
                +PUTCH_IMAGE+" text, " 
                +VISIBLE+" integer );"
                );
        ContentValues values=new ContentValues();
        values.put(ENG_WORD, "compare");
        values.put(RUS_WORD, "сравнивать");
        values.put(ASSOCIATION, "СРАВНЕНИЕ сигналов на компараторе");
        values.put(PUTCH_IMAGE, "PoliglotDictonaryPictures/compare.jpeg");
        values.put(VISIBLE, 1);
        db.insert(TABLE_NAME, ENG_WORD, values);
        
        values.put(ENG_WORD, "may");
        values.put(RUS_WORD, "мочь, иметь право");
        values.put(ASSOCIATION, "дед  в мае МОЖЕТ но прав не имеет");
        values.put(PUTCH_IMAGE, "PoliglotDictonaryPictures/may.jpeg");
        values.put(VISIBLE, 1);
        db.insert(TABLE_NAME, ENG_WORD, values);
        
        values.put(ENG_WORD, "ring");
        values.put(RUS_WORD, "звонить");
        values.put(ASSOCIATION, "на ринге ЗВОНИТ гонг");
        values.put(PUTCH_IMAGE, "PoliglotDictonaryPictures/ring.jpeg");
        values.put(VISIBLE, 1);
        db.insert(TABLE_NAME, ENG_WORD, values);
        
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
 
    }
 
}
В коде есть такие строчки
Java
1
2
3
4
int positionCursor=cur.getPosition();
            Intent intent=new Intent(this, EditDictonary.class);
            intent.putExtra("positionCursor", positionCursor);
            startActivity(intent);
Это для передачи записи которую просматриваем в другую активность. Где предполагается редактирование данных
В активити приемнике соотв прописываем.
Java
1
2
3
4
5
6
7
8
9
10
//Log.d(MY_LOG, "Получаем интент ");
        Intent intent=getIntent();
        positionCursor=intent.getIntExtra("positionCursor",-1);
        //Log.d(MY_LOG, "Значение  positionCursor = "+positionCursor);
        //Создаем обьект базы данных открываем базу на запись
        dictDB=new DictonaryDB(this);
        SQLiteDatabase db=dictDB.getWritableDatabase();
        //Log.d(MY_LOG, "ставим курсор на позицию ");
        cur=db.query("dictonary", null, null, null, null, null, null);
        cur.moveToPosition(positionCursor);
Добавлено через 11 минут
Пути к файлам находящимся SdCard или на устройстве прописываются соотв.
String patch="/mnt/sdcard/DictonaryPictures/may.jpeg";
String patch="/data/ProbaFolder/ImageDict/let.jpeg";
если делаете проект в эклипсе, то с SdCard целый квест подробно описал тут.http://forum.startandroid.ru/v... 320b9cac35
П.С. Коды рабочие, но еще не закончены, есть лишние строки.
0
27.02.2015, 08:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2015, 08:42
Помогаю со студенческими работами здесь

Как загружать стринги из сети в TextViev
Добрый день, у меня в приложение используются TextView текст для которых находится в самом...

Как при появлении Wifi загружать данные
Есть приложение. В нем есть много фрагментов которые подгружают данные из сервера, но юзер зашел в...

Как удобнее загружать огромный массив в приложение?
Как удобнее грузить данные? есть огромный массив чисел (Float) которые нужно подгружать в...

Не могу найти где лежит файл базы SQLite
Здравствуйте, столкнулся с такой проблемой, сразу скажу с базами работаю впервые, в общем есть файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru