Cursor cursor = resolver.query(uri, null, null, null); boolean mr = cursor.moveToFirst(); Long ms = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE)) 为什么上述代码查到的文件大小是0,已知大小不为0
时间: 2024-04-06 15:34:32 浏览: 17
可能是因为你使用的是 MediaStore.Files.FileColumns.SIZE 常量,该常量适用于 MediaStore.Files 表,而不是 MediaStore.Images 或 MediaStore.Video 表,因此可能无法正确获取文件的大小。
你可以尝试使用 MediaStore.Images.ImageColumns.SIZE 或 MediaStore.Video.VideoColumns.SIZE 常量,具体常量取决于你要查询的是图片还是视频文件。如果你要查询的是其他类型的文件,可以尝试使用 File.length() 方法来获取文件的大小。
相关问题
public class RetrieveDataActivity extends Activity { private String[] columns={ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv=(TextView) findViewById(R.id.result); tv.setText(getQueryData()); } private String getQueryData(){ StringBuilder sb=new StringBuilder(); ContentResolver resolver=getContentResolver(); Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); while (cursor.moveToNext()){ int idIndex=cursor.getColumnIndex(columns[0]); int displayNameIndex= cursor.getColumnIndex(columns[1]); int id=cursor.getInt(idIndex); String displayName=cursor.getString(displayNameIndex); Cursor phone= resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,columns[3]+"="+id,null,null); while(phone.moveToNext()){ int phoneNumberIndex=phone.getColumnIndex(columns[2]); String phoneNumber=phone.getString(phoneNumberIndex); sb.append(displayName+":"+phoneNumber+"\n"); cursor.close(); } }
根据你提供的代码,我发现在第二个while循环中,没有关闭`phone`游标。这可能是导致无法查询出通讯录内容的原因之一。
另外,`cursor.close()`应该在第一个while循环的末尾处调用,而不是在第二个while循环的末尾处调用。因为第二个while循环是在第一个while循环的内部执行的,如果在第二个while循环中关闭了游标,那么第一个while循环将无法正常执行。
此外,我还注意到在查询电话号码时,`columns[3]`应该是`ContactsContract.CommonDataKinds.Phone.CONTACT_ID`,而不是`ContactsContract.CommonDataKinds.Phone.NUMBER`,因为`columns[3]`对应的是通讯录ID,而不是电话号码。
修改后的代码如下:
```
public class RetrieveDataActivity extends Activity {
private String[] columns = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.result);
tv.setText(getQueryData());
}
private String getQueryData() {
StringBuilder sb = new StringBuilder();
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
int idIndex = cursor.getColumnIndex(columns[0]);
int displayNameIndex = cursor.getColumnIndex(columns[1]);
int id = cursor.getInt(idIndex);
String displayName = cursor.getString(displayNameIndex);
Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, columns[3] + "=" + id, null, null);
while (phone.moveToNext()) {
int phoneNumberIndex = phone.getColumnIndex(columns[2]);
String phoneNumber = phone.getString(phoneNumberIndex);
sb.append(displayName + ":" + phoneNumber + "\n");
}
phone.close();
}
cursor.close();
return sb.toString();
}
}
```
希望这可以帮到你。
Uri add = resolver.insert(uri, values);怎么判断输入的学号重复
在插入数据之前,你可以先使用 ContentResolver 的 query() 方法来查询该学号是否已经存在于数据库中。如果查询结果不为空,说明该学号已经存在,此时就可以提示用户输入的学号已经存在,要求用户重新输入。如果查询结果为空,说明该学号可以被插入到数据库中,此时你可以继续执行插入操作。下面是一个示例代码:
```java
// 查询学号是否已经存在
Cursor cursor = getContentResolver().query(uri, null, "学号=?", new String[]{学号}, null);
if (cursor != null && cursor.moveToFirst()) {
// 学号已经存在,提示用户重新输入
Toast.makeText(this, "学号已经存在,请重新输入", Toast.LENGTH_SHORT).show();
cursor.close();
} else {
// 学号可以被插入到数据库中,执行插入操作
Uri add = getContentResolver().insert(uri, values);
}
```